🔗 ARMProxy.constructor | 💥 > 🔗 ARMProxy.setARM | 💥🔴❌ ['onlyOwner'] > 🔗 ConfirmedOwnerWithProposal.onlyOwner | 🌈 > 🔗 ConfirmedOwnerWithProposal._validateOwnership | 🟢🟩
🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address._revert | 🟩
🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address.isContract | 🟩
🔗 Address.functionCallWithValue | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address._revert | 🟩
🔗 Address.functionCallWithValue | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address.isContract | 🟩
🔗 Address.functionDelegateCall | > 🔗 Address.functionDelegateCall | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address._revert | 🟩
🔗 Address.functionDelegateCall | > 🔗 Address.functionDelegateCall | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address.isContract | 🟩
🔗 Address.functionStaticCall | 🟩 > 🔗 Address.functionStaticCall | 🟩❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address._revert | 🟩
🔗 Address.functionStaticCall | 🟩 > 🔗 Address.functionStaticCall | 🟩❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address.isContract | 🟩
🔗 Address.verifyCallResult | 🟩 > 🔗 Address._revert | 🟩
🔗 AuthorizedCallers.applyAuthorizedCallerUpdates | 💥❌ ['onlyOwner'] > 🔗 AuthorizedCallers._applyAuthorizedCallerUpdates | 🟢 > 🔗 EnumerableSet.add | > 🔗 EnumerableSet._add | > 🔗 EnumerableSet._contains | 🟩
🔗 AuthorizedCallers.applyAuthorizedCallerUpdates | 💥❌ ['onlyOwner'] > 🔗 AuthorizedCallers._applyAuthorizedCallerUpdates | 🟢 > 🔗 EnumerableSet.remove | > 🔗 EnumerableSet._remove |
🔗 AuthorizedCallers.applyAuthorizedCallerUpdates | 💥❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 AuthorizedCallers.constructor | 💥 > 🔗 AuthorizedCallers._applyAuthorizedCallerUpdates | 🟢 > 🔗 EnumerableSet.add | > 🔗 EnumerableSet._add | > 🔗 EnumerableSet._contains | 🟩
🔗 AuthorizedCallers.constructor | 💥 > 🔗 AuthorizedCallers._applyAuthorizedCallerUpdates | 🟢 > 🔗 EnumerableSet.remove | > 🔗 EnumerableSet._remove |
🔗 AuthorizedCallers.getAllAuthorizedCallers | 💥🟢🟩 > 🔗 EnumerableSet.values | 🟩 > 🔗 EnumerableSet._values | 🟩
🔗 BurnFromMintTokenPool.constructor | 💥 > 🔗 SafeERC20.safeIncreaseAllowance | > 🔗 ERC20.allowance | 💥🟢🟩
🔗 BurnFromMintTokenPool.constructor | 💥 > 🔗 SafeERC20.safeIncreaseAllowance | > 🔗 IERC20.allowance | 💥🟩
🔗 BurnFromMintTokenPool.constructor | 💥 > 🔗 SafeERC20.safeIncreaseAllowance | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address._revert | 🟩
🔗 BurnFromMintTokenPool.constructor | 💥 > 🔗 SafeERC20.safeIncreaseAllowance | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address.isContract | 🟩
🔗 BurnFromMintTokenPool.constructor | 💥 > 🔗 TokenPool.constructor | 🟢🔴 > 🔗 TokenPool._applyAllowListUpdates | 🟢 > 🔗 EnumerableSet.add | > 🔗 EnumerableSet._add | > 🔗 EnumerableSet._contains | 🟩
🔗 BurnFromMintTokenPool.constructor | 💥 > 🔗 TokenPool.constructor | 🟢🔴 > 🔗 TokenPool._applyAllowListUpdates | 🟢 > 🔗 EnumerableSet.remove | > 🔗 EnumerableSet._remove |
🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burn | 💥 > 🔗 Context._msgSender | 🟩
🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner'] > 🔗 FactoryBurnMintERC20.onlyBurner | 🌈 > 🔗 FactoryBurnMintERC20.isBurner | 💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnWithFromMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥 > 🔗 FactoryBurnMintERC20.burnFrom | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burnFrom | 💥 > 🔗 ERC20._spendAllowance | > 🔗 FactoryBurnMintERC20._approve | ['validAddress(address)'] > 🔗 ERC20._approve | 🔴
🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnWithFromMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥 > 🔗 FactoryBurnMintERC20.burnFrom | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burnFrom | 💥 > 🔗 ERC20._spendAllowance | > 🔗 FactoryBurnMintERC20._approve | ['validAddress(address)'] > 🔗 FactoryBurnMintERC20.validAddress | 🌈
🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnWithFromMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥 > 🔗 FactoryBurnMintERC20.burnFrom | 💥❌ ['onlyBurner'] > 🔗 FactoryBurnMintERC20.onlyBurner | 🌈 > 🔗 FactoryBurnMintERC20.isBurner | 💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢 > 🔗 RateLimiter._consume | > 🔗 RateLimiter._calculateRefill | 🟩 > 🔗 RateLimiter._min | 🟩
🔗 BurnMintTokenPoolAbstract.releaseOrMint | 💥🟢 > 🔗 FactoryBurnMintERC20.mint | 💥🟢❌ ['onlyMinter', 'validAddress(address)'] > 🔗 ERC20._mint | 🟢🔴 > 🔗 ERC20._afterTokenTransfer |
🔗 BurnMintTokenPoolAbstract.releaseOrMint | 💥🟢 > 🔗 FactoryBurnMintERC20.mint | 💥🟢❌ ['onlyMinter', 'validAddress(address)'] > 🔗 ERC20._mint | 🟢🔴 > 🔗 ERC20._beforeTokenTransfer |
🔗 BurnMintTokenPoolAbstract.releaseOrMint | 💥🟢 > 🔗 FactoryBurnMintERC20.mint | 💥🟢❌ ['onlyMinter', 'validAddress(address)'] > 🔗 ERC20.totalSupply | 💥🟢🟩
🔗 BurnMintTokenPoolAbstract.releaseOrMint | 💥🟢 > 🔗 FactoryBurnMintERC20.mint | 💥🟢❌ ['onlyMinter', 'validAddress(address)'] > 🔗 FactoryBurnMintERC20.onlyMinter | 🌈 > 🔗 FactoryBurnMintERC20.isMinter | 💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 BurnMintTokenPoolAbstract.releaseOrMint | 💥🟢 > 🔗 FactoryBurnMintERC20.mint | 💥🟢❌ ['onlyMinter', 'validAddress(address)'] > 🔗 FactoryBurnMintERC20.validAddress | 🌈
🔗 BurnMintTokenPoolAbstract.releaseOrMint | 💥🟢 > 🔗 IBurnMintERC20.mint | 💥
🔗 BurnMintTokenPoolAbstract.releaseOrMint | 💥🟢 > 🔗 TokenPool._validateReleaseOrMint | 🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 BurnMintTokenPoolAbstract.releaseOrMint | 💥🟢 > 🔗 TokenPool._validateReleaseOrMint | 🟢 > 🔗 TokenPool._consumeInboundRateLimit | 🟢 > 🔗 RateLimiter._consume | > 🔗 RateLimiter._calculateRefill | 🟩 > 🔗 RateLimiter._min | 🟩
🔗 BurnMintTokenPoolAbstract.releaseOrMint | 💥🟢 > 🔗 TokenPool._validateReleaseOrMint | 🟢 > 🔗 TokenPool._onlyOffRamp | 🟢🟩 > 🔗 IRouter.isOffRamp | 💥🟩
🔗 BurnMintTokenPoolAbstract.releaseOrMint | 💥🟢 > 🔗 TokenPool._validateReleaseOrMint | 🟢 > 🔗 TokenPool._onlyOffRamp | 🟢🟩 > 🔗 Router.isOffRamp | 💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 BurnMintTokenPoolAbstract.releaseOrMint | 💥🟢 > 🔗 TokenPool._validateReleaseOrMint | 🟢 > 🔗 TokenPool._onlyOffRamp | 🟢🟩 > 🔗 Router.isOffRamp | 💥🟢🟩 > 🔗 Router._mergeChainSelectorAndOffRamp | 🟩
🔗 BurnMintTokenPoolAbstract.releaseOrMint | 💥🟢 > 🔗 TokenPool._validateReleaseOrMint | 🟢 > 🔗 TokenPool._onlyOffRamp | 🟢🟩 > 🔗 TokenPool.isSupportedChain | 💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 BurnMintTokenPoolAbstract.releaseOrMint | 💥🟢 > 🔗 TokenPool._validateReleaseOrMint | 🟢 > 🔗 TokenPool.getRemotePool | 💥🟢🟩
🔗 BurnMintTokenPoolAbstract.releaseOrMint | 💥🟢 > 🔗 TokenPool._validateReleaseOrMint | 🟢 > 🔗 TokenPool.isSupportedToken | 💥🟢🟩
🔗 BurnMintWithLockReleaseFlagTokenPool.constructor | 💥 > 🔗 BurnMintTokenPool.constructor | 💥 > 🔗 TokenPool.constructor | 🟢🔴 > 🔗 TokenPool._applyAllowListUpdates | 🟢 > 🔗 EnumerableSet.add | > 🔗 EnumerableSet._add | > 🔗 EnumerableSet._contains | 🟩
🔗 BurnMintWithLockReleaseFlagTokenPool.constructor | 💥 > 🔗 BurnMintTokenPool.constructor | 💥 > 🔗 TokenPool.constructor | 🟢🔴 > 🔗 TokenPool._applyAllowListUpdates | 🟢 > 🔗 EnumerableSet.remove | > 🔗 EnumerableSet._remove |
🔗 BurnWithFromMintTokenPool.constructor | 💥 > 🔗 SafeERC20.safeIncreaseAllowance | > 🔗 ERC20.allowance | 💥🟢🟩
🔗 BurnWithFromMintTokenPool.constructor | 💥 > 🔗 SafeERC20.safeIncreaseAllowance | > 🔗 IERC20.allowance | 💥🟩
🔗 BurnWithFromMintTokenPool.constructor | 💥 > 🔗 SafeERC20.safeIncreaseAllowance | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address._revert | 🟩
🔗 BurnWithFromMintTokenPool.constructor | 💥 > 🔗 SafeERC20.safeIncreaseAllowance | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address.isContract | 🟩
🔗 BurnWithFromMintTokenPool.constructor | 💥 > 🔗 TokenPool.constructor | 🟢🔴 > 🔗 TokenPool._applyAllowListUpdates | 🟢 > 🔗 EnumerableSet.add | > 🔗 EnumerableSet._add | > 🔗 EnumerableSet._contains | 🟩
🔗 BurnWithFromMintTokenPool.constructor | 💥 > 🔗 TokenPool.constructor | 🟢🔴 > 🔗 TokenPool._applyAllowListUpdates | 🟢 > 🔗 EnumerableSet.remove | > 🔗 EnumerableSet._remove |
🔗 CCIPClientExample.ccipReceive | 💥❌ ['onlyRouter', 'validChain(uint64)'] > 🔗 CCIPClientExample._ccipReceive |
🔗 CCIPClientExample.ccipReceive | 💥❌ ['onlyRouter', 'validChain(uint64)'] > 🔗 CCIPClientExample.validChain | 🌈🟢
🔗 CCIPClientExample.ccipReceive | 💥❌ ['onlyRouter', 'validChain(uint64)'] > 🔗 CCIPReceiver.onlyRouter | 🌈 > 🔗 CCIPReceiver.getRouter | 💥🟢🟩
🔗 CCIPClientExample.constructor | 💥🟢🔴 > 🔗 ERC20.approve | 💥 > 🔗 Context._msgSender | 🟩
🔗 CCIPClientExample.constructor | 💥🟢🔴 > 🔗 IERC20.approve | 💥
🔗 CCIPClientExample.disableChain | 💥🟢🔴❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 CCIPClientExample.enableChain | 💥🔴❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 CCIPClientExample.validChain | 🌈🟢
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 ERC20.approve | 💥 > 🔗 Context._msgSender | 🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 ERC20.approve | 💥 > 🔗 ERC20._approve | 🔴
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 ERC20.approve | 💥 > 🔗 FactoryBurnMintERC20._approve | ['validAddress(address)'] > 🔗 ERC20._approve | 🔴
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 ERC20.approve | 💥 > 🔗 FactoryBurnMintERC20._approve | ['validAddress(address)'] > 🔗 FactoryBurnMintERC20.validAddress | 🌈
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 ERC20.transferFrom | 💥 > 🔗 Context._msgSender | 🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 ERC20.transferFrom | 💥 > 🔗 ERC20._spendAllowance | > 🔗 ERC20._approve | 🔴
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 ERC20.transferFrom | 💥 > 🔗 ERC20._spendAllowance | > 🔗 ERC20.allowance | 💥🟢🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 ERC20.transferFrom | 💥 > 🔗 ERC20._spendAllowance | > 🔗 FactoryBurnMintERC20._approve | ['validAddress(address)'] > 🔗 ERC20._approve | 🔴
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 ERC20.transferFrom | 💥 > 🔗 ERC20._spendAllowance | > 🔗 FactoryBurnMintERC20._approve | ['validAddress(address)'] > 🔗 FactoryBurnMintERC20.validAddress | 🌈
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 ERC20.transferFrom | 💥 > 🔗 ERC20._transfer | 🟢🔴
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 ERC20.transferFrom | 💥 > 🔗 ERC20._transfer | 🟢🔴 > 🔗 ERC20._afterTokenTransfer |
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 ERC20.transferFrom | 💥 > 🔗 ERC20._transfer | 🟢🔴 > 🔗 ERC20._beforeTokenTransfer |
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 ERC20.transferFrom | 💥 > 🔗 FactoryBurnMintERC20._transfer | ['validAddress(address)'] > 🔗 ERC20._transfer | 🟢🔴 > 🔗 ERC20._afterTokenTransfer |
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 ERC20.transferFrom | 💥 > 🔗 FactoryBurnMintERC20._transfer | ['validAddress(address)'] > 🔗 ERC20._transfer | 🟢🔴 > 🔗 ERC20._beforeTokenTransfer |
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 ERC20.transferFrom | 💥 > 🔗 FactoryBurnMintERC20._transfer | ['validAddress(address)'] > 🔗 FactoryBurnMintERC20.validAddress | 🌈
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 IERC20.approve | 💥
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 IERC20.transferFrom | 💥
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 IRouterClient.ccipSend | 💥💲
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 IEVM2AnyOnRampClient.forwardFromRouter | 💥
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 IEVM2AnyOnRampClient.getFee | 💥🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 IEVM2AnyOnRampClient.getPoolBySourceToken | 💥🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 IWrappedNative.deposit | 💥💲
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 FeeQuoter.processMessageArgs | 🎯💥🟢🟩 > 🔗 Client._argsToBytes | 🎯🟢🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 FeeQuoter.processMessageArgs | 🎯💥🟢🟩 > 🔗 FeeQuoter._parseUnvalidatedEVMExtraArgsFromBytes | 🎯🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 FeeQuoter.processMessageArgs | 🎯💥🟢🟩 > 🔗 FeeQuoter._processPoolReturnData | 🎯🟢🟩 > 🔗 FeeQuoter._validateDestFamilyAddress | 🎯🟩 > 🔗 Internal._validateEVMAddress | 🎯🟢🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 FeeQuoter.processMessageArgs | 🎯💥🟢🟩 > 🔗 FeeQuoter.convertTokenAmount | 🎯💥🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 IFeeQuoter.processMessageArgs | 🎯💥🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 IMessageInterceptor.onOutboundMessage | 🎯💥
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 INonceManager.getIncrementedOutboundNonce | 🎯💥
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 Internal._hash | 🎯🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 AuthorizedCallers.onlyAuthorizedCallers | 🌈 > 🔗 AuthorizedCallers._validateCaller | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 EnumerableMapAddresses.contains | 🟩 > 🔗 EnumerableMapBytes32.contains | 🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 MultiAggregateRateLimiter._getTokenBucket | 🎯🟢🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 MultiAggregateRateLimiter._getTokenValue | 🎯🟢🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 MultiAggregateRateLimiter._getTokenValue | 🎯🟢🟩 > 🔗 IPriceRegistry.getTokenPrice | 💥🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 MultiAggregateRateLimiter._getTokenValue | 🎯🟢🟩 > 🔗 USDPriceWith18Decimals._calcUSDValueFromTokenAmount | 🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 RateLimiter._consume | > 🔗 RateLimiter._calculateRefill | 🟩 > 🔗 RateLimiter._min | 🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 NonceManager.getIncrementedOutboundNonce | 🎯💥🔴❌ ['onlyAuthorizedCallers'] > 🔗 AuthorizedCallers.onlyAuthorizedCallers | 🌈 > 🔗 AuthorizedCallers._validateCaller | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 NonceManager.getIncrementedOutboundNonce | 🎯💥🔴❌ ['onlyAuthorizedCallers'] > 🔗 NonceManager._getOutboundNonce | 🎯🟢🟩 > 🔗 IEVM2AnyOnRamp.getSenderNonce | 💥🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burnFrom | 💥 > 🔗 Context._msgSender | 🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burnFrom | 💥 > 🔗 ERC20._burn | 🟢🔴
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burnFrom | 💥 > 🔗 ERC20._spendAllowance |
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burnFrom | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burnFrom | 💥
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burnFrom | 💥❌ ['onlyBurner'] > 🔗 FactoryBurnMintERC20.onlyBurner | 🌈
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 IBurnMintERC20.burnFrom | 💥
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burn | 💥 > 🔗 Context._msgSender | 🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burn | 💥 > 🔗 ERC20._burn | 🟢🔴
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner']
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burn | 💥
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner'] > 🔗 FactoryBurnMintERC20.onlyBurner | 🌈
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 IBurnMintERC20.burn | 💥
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPoolAbstract._burn |
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnWithFromMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥 > 🔗 FactoryBurnMintERC20.burnFrom | 💥❌ ['onlyBurner']
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnWithFromMintTokenPool._burn | 🟢 > 🔗 IBurnMintERC20.burn | 💥
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢 > 🔗 RateLimiter._consume |
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 IRouter.getOnRamp | 💥🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 Router.getOnRamp | 💥🟢🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 TokenPool.isSupportedChain | 💥🟢🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool.isSupportedToken | 💥🟢🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool.getRemoteToken | 💥🟢🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burn | 💥 > 🔗 Context._msgSender | 🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burn | 💥 > 🔗 ERC20._burn | 🟢🔴
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burn | 💥
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner'] > 🔗 FactoryBurnMintERC20.onlyBurner | 🌈
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 IBurnMintERC20.burn | 💥
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢 > 🔗 RateLimiter._consume |
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 IRouter.getOnRamp | 💥🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 Router.getOnRamp | 💥🟢🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 TokenPool.isSupportedChain | 💥🟢🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool.isSupportedToken | 💥🟢🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool.getRemoteToken | 💥🟢🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 CCIPHome.supportsInterface | 🎯💥🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 CCIPReceiver.supportsInterface | 💥🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 FactoryBurnMintERC20.supportsInterface | 💥🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool.isSupportedToken | 💥🟢🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool.getRemoteToken | 💥🟢🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool.shouldUseLockRelease | 💥🟢🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 ITokenMessenger.depositForBurnWithCaller | 💥
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool.isSupportedToken | 💥🟢🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool.getRemoteToken | 💥🟢🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 IERC165.supportsInterface | 💥🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 IERC165.supportsInterface | 💥🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 IPoolV1.lockOrBurn | 💥
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢 > 🔗 RateLimiter._consume |
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 IRouter.getOnRamp | 💥🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 Router.getOnRamp | 💥🟢🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 TokenPool.isSupportedChain | 💥🟢🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool.isSupportedToken | 💥🟢🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool.getRemoteToken | 💥🟢🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.supportsInterface | 💥🟩 > 🔗 TokenPool.supportsInterface | 💥🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 OnRamp.getPoolBySourceToken | 🎯💥🟢🟩 > 🔗 ITokenAdminRegistry.getPool | 💥🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 OnRamp.getPoolBySourceToken | 🎯💥🟢🟩 > 🔗 TokenAdminRegistry.getPool | 💥🟢🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 TokenPool.supportsInterface | 💥🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 ITokenMessenger.depositForBurnWithCaller | 💥
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢 > 🔗 RateLimiter._consume |
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 IRouter.getOnRamp | 💥🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 Router.getOnRamp | 💥🟢🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 TokenPool.isSupportedChain | 💥🟢🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool.isSupportedToken | 💥🟢🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool.getRemoteToken | 💥🟢🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getDataAvailabilityCost | 🎯🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenTransferCost | 🎯🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenTransferCost | 🎯🟢🟩 > 🔗 USDPriceWith18Decimals._calcUSDValueFromTokenAmount | 🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getValidatedGasPrice | 🎯🟢🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 AggregatorV3Interface.decimals | 💥🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 AggregatorV3Interface.latestRoundData | 💥🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 FeeQuoter._calculateRebasedValue | 🎯🟢🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._parseEVMExtraArgsFromBytes | 🎯🟩 > 🔗 FeeQuoter._parseUnvalidatedEVMExtraArgsFromBytes | 🎯🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._validateMessage | 🎯🟩 > 🔗 FeeQuoter._validateDestFamilyAddress | 🎯🟩 > 🔗 Internal._validateEVMAddress | 🎯🟢🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 IFeeQuoter.getValidatedFee | 🎯💥🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 IRMNRemote.isCursed | 🎯💥🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 RMNRemote.isCursed | 🎯💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 RMNRemote.isCursed | 🎯💥🟢🟩 > 🔗 EnumerableSet.length | 🟩 > 🔗 EnumerableSet._length | 🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getPoolBySourceToken | 🎯💥🟢🟩 > 🔗 ITokenAdminRegistry.getPool | 💥🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getPoolBySourceToken | 🎯💥🟢🟩 > 🔗 TokenAdminRegistry.getPool | 💥🟢🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 Router.whenNotCursed | 🌈🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 SafeERC20.safeTransfer | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address._revert | 🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 SafeERC20.safeTransfer | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address.isContract | 🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 SafeERC20.safeTransferFrom | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address._revert | 🟩
🔗 CCIPClientExample.sendDataAndTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 SafeERC20.safeTransferFrom | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address.isContract | 🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 CCIPClientExample.validChain | 🌈🟢
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 IRouterClient.ccipSend | 💥💲
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 IEVM2AnyOnRampClient.forwardFromRouter | 💥
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 IEVM2AnyOnRampClient.getFee | 💥🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 IEVM2AnyOnRampClient.getPoolBySourceToken | 💥🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 IWrappedNative.deposit | 💥💲
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 FeeQuoter.processMessageArgs | 🎯💥🟢🟩 > 🔗 Client._argsToBytes | 🎯🟢🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 FeeQuoter.processMessageArgs | 🎯💥🟢🟩 > 🔗 FeeQuoter._parseUnvalidatedEVMExtraArgsFromBytes | 🎯🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 FeeQuoter.processMessageArgs | 🎯💥🟢🟩 > 🔗 FeeQuoter._processPoolReturnData | 🎯🟢🟩 > 🔗 FeeQuoter._validateDestFamilyAddress | 🎯🟩 > 🔗 Internal._validateEVMAddress | 🎯🟢🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 FeeQuoter.processMessageArgs | 🎯💥🟢🟩 > 🔗 FeeQuoter.convertTokenAmount | 🎯💥🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 IFeeQuoter.processMessageArgs | 🎯💥🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 IMessageInterceptor.onOutboundMessage | 🎯💥
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 INonceManager.getIncrementedOutboundNonce | 🎯💥
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 Internal._hash | 🎯🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 AuthorizedCallers.onlyAuthorizedCallers | 🌈 > 🔗 AuthorizedCallers._validateCaller | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 EnumerableMapAddresses.contains | 🟩 > 🔗 EnumerableMapBytes32.contains | 🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 MultiAggregateRateLimiter._getTokenBucket | 🎯🟢🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 MultiAggregateRateLimiter._getTokenValue | 🎯🟢🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 MultiAggregateRateLimiter._getTokenValue | 🎯🟢🟩 > 🔗 IPriceRegistry.getTokenPrice | 💥🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 MultiAggregateRateLimiter._getTokenValue | 🎯🟢🟩 > 🔗 USDPriceWith18Decimals._calcUSDValueFromTokenAmount | 🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 RateLimiter._consume | > 🔗 RateLimiter._calculateRefill | 🟩 > 🔗 RateLimiter._min | 🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 NonceManager.getIncrementedOutboundNonce | 🎯💥🔴❌ ['onlyAuthorizedCallers'] > 🔗 AuthorizedCallers.onlyAuthorizedCallers | 🌈 > 🔗 AuthorizedCallers._validateCaller | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 NonceManager.getIncrementedOutboundNonce | 🎯💥🔴❌ ['onlyAuthorizedCallers'] > 🔗 NonceManager._getOutboundNonce | 🎯🟢🟩 > 🔗 IEVM2AnyOnRamp.getSenderNonce | 💥🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burnFrom | 💥 > 🔗 Context._msgSender | 🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burnFrom | 💥 > 🔗 ERC20._burn | 🟢🔴
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burnFrom | 💥 > 🔗 ERC20._spendAllowance |
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burnFrom | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burnFrom | 💥
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burnFrom | 💥❌ ['onlyBurner'] > 🔗 FactoryBurnMintERC20.onlyBurner | 🌈
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 IBurnMintERC20.burnFrom | 💥
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burn | 💥 > 🔗 Context._msgSender | 🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burn | 💥 > 🔗 ERC20._burn | 🟢🔴
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burn | 💥
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner'] > 🔗 FactoryBurnMintERC20.onlyBurner | 🌈
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 IBurnMintERC20.burn | 💥
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPoolAbstract._burn |
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnWithFromMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥 > 🔗 FactoryBurnMintERC20.burnFrom | 💥❌ ['onlyBurner']
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnWithFromMintTokenPool._burn | 🟢 > 🔗 IBurnMintERC20.burn | 💥
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢 > 🔗 RateLimiter._consume |
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 IRouter.getOnRamp | 💥🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 Router.getOnRamp | 💥🟢🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 TokenPool.isSupportedChain | 💥🟢🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool.isSupportedToken | 💥🟢🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool.getRemoteToken | 💥🟢🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burn | 💥 > 🔗 Context._msgSender | 🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burn | 💥 > 🔗 ERC20._burn | 🟢🔴
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burn | 💥
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner'] > 🔗 FactoryBurnMintERC20.onlyBurner | 🌈
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 IBurnMintERC20.burn | 💥
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢 > 🔗 RateLimiter._consume |
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 IRouter.getOnRamp | 💥🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 Router.getOnRamp | 💥🟢🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 TokenPool.isSupportedChain | 💥🟢🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool.isSupportedToken | 💥🟢🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool.getRemoteToken | 💥🟢🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 CCIPHome.supportsInterface | 🎯💥🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 CCIPReceiver.supportsInterface | 💥🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 FactoryBurnMintERC20.supportsInterface | 💥🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool.isSupportedToken | 💥🟢🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool.getRemoteToken | 💥🟢🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool.shouldUseLockRelease | 💥🟢🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 ITokenMessenger.depositForBurnWithCaller | 💥
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool.isSupportedToken | 💥🟢🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool.getRemoteToken | 💥🟢🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 IERC165.supportsInterface | 💥🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 IERC165.supportsInterface | 💥🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 IPoolV1.lockOrBurn | 💥
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢 > 🔗 RateLimiter._consume |
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 IRouter.getOnRamp | 💥🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 Router.getOnRamp | 💥🟢🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 TokenPool.isSupportedChain | 💥🟢🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool.isSupportedToken | 💥🟢🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool.getRemoteToken | 💥🟢🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.supportsInterface | 💥🟩 > 🔗 TokenPool.supportsInterface | 💥🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 OnRamp.getPoolBySourceToken | 🎯💥🟢🟩 > 🔗 ITokenAdminRegistry.getPool | 💥🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 OnRamp.getPoolBySourceToken | 🎯💥🟢🟩 > 🔗 TokenAdminRegistry.getPool | 💥🟢🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 TokenPool.supportsInterface | 💥🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 ITokenMessenger.depositForBurnWithCaller | 💥
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢 > 🔗 RateLimiter._consume |
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 IRouter.getOnRamp | 💥🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 Router.getOnRamp | 💥🟢🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 TokenPool.isSupportedChain | 💥🟢🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool.isSupportedToken | 💥🟢🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool.getRemoteToken | 💥🟢🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getDataAvailabilityCost | 🎯🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenTransferCost | 🎯🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenTransferCost | 🎯🟢🟩 > 🔗 USDPriceWith18Decimals._calcUSDValueFromTokenAmount | 🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getValidatedGasPrice | 🎯🟢🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 AggregatorV3Interface.decimals | 💥🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 AggregatorV3Interface.latestRoundData | 💥🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 FeeQuoter._calculateRebasedValue | 🎯🟢🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._parseEVMExtraArgsFromBytes | 🎯🟩 > 🔗 FeeQuoter._parseUnvalidatedEVMExtraArgsFromBytes | 🎯🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._validateMessage | 🎯🟩 > 🔗 FeeQuoter._validateDestFamilyAddress | 🎯🟩 > 🔗 Internal._validateEVMAddress | 🎯🟢🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 IFeeQuoter.getValidatedFee | 🎯💥🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 IRMNRemote.isCursed | 🎯💥🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 RMNRemote.isCursed | 🎯💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 RMNRemote.isCursed | 🎯💥🟢🟩 > 🔗 EnumerableSet.length | 🟩 > 🔗 EnumerableSet._length | 🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getPoolBySourceToken | 🎯💥🟢🟩 > 🔗 ITokenAdminRegistry.getPool | 💥🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getPoolBySourceToken | 🎯💥🟢🟩 > 🔗 TokenAdminRegistry.getPool | 💥🟢🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 Router.whenNotCursed | 🌈🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 SafeERC20.safeTransfer | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address._revert | 🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 SafeERC20.safeTransfer | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address.isContract | 🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 SafeERC20.safeTransferFrom | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address._revert | 🟩
🔗 CCIPClientExample.sendDataPayFeeToken | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 SafeERC20.safeTransferFrom | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address.isContract | 🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 CCIPClientExample.validChain | 🌈🟢
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 IRouterClient.ccipSend | 💥💲
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 IRouterClient.getFee | 💥🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 IEVM2AnyOnRampClient.forwardFromRouter | 💥
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 IEVM2AnyOnRampClient.getFee | 💥🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 IEVM2AnyOnRampClient.getPoolBySourceToken | 💥🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 IWrappedNative.deposit | 💥💲
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 FeeQuoter.processMessageArgs | 🎯💥🟢🟩 > 🔗 Client._argsToBytes | 🎯🟢🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 FeeQuoter.processMessageArgs | 🎯💥🟢🟩 > 🔗 FeeQuoter._parseUnvalidatedEVMExtraArgsFromBytes | 🎯🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 FeeQuoter.processMessageArgs | 🎯💥🟢🟩 > 🔗 FeeQuoter._processPoolReturnData | 🎯🟢🟩 > 🔗 FeeQuoter._validateDestFamilyAddress | 🎯🟩 > 🔗 Internal._validateEVMAddress | 🎯🟢🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 FeeQuoter.processMessageArgs | 🎯💥🟢🟩 > 🔗 FeeQuoter.convertTokenAmount | 🎯💥🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 IFeeQuoter.processMessageArgs | 🎯💥🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 IMessageInterceptor.onOutboundMessage | 🎯💥
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 INonceManager.getIncrementedOutboundNonce | 🎯💥
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 Internal._hash | 🎯🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 AuthorizedCallers.onlyAuthorizedCallers | 🌈 > 🔗 AuthorizedCallers._validateCaller | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 EnumerableMapAddresses.contains | 🟩 > 🔗 EnumerableMapBytes32.contains | 🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 MultiAggregateRateLimiter._getTokenBucket | 🎯🟢🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 MultiAggregateRateLimiter._getTokenValue | 🎯🟢🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 MultiAggregateRateLimiter._getTokenValue | 🎯🟢🟩 > 🔗 IPriceRegistry.getTokenPrice | 💥🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 MultiAggregateRateLimiter._getTokenValue | 🎯🟢🟩 > 🔗 USDPriceWith18Decimals._calcUSDValueFromTokenAmount | 🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 RateLimiter._consume | > 🔗 RateLimiter._calculateRefill | 🟩 > 🔗 RateLimiter._min | 🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 NonceManager.getIncrementedOutboundNonce | 🎯💥🔴❌ ['onlyAuthorizedCallers'] > 🔗 AuthorizedCallers.onlyAuthorizedCallers | 🌈 > 🔗 AuthorizedCallers._validateCaller | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 NonceManager.getIncrementedOutboundNonce | 🎯💥🔴❌ ['onlyAuthorizedCallers'] > 🔗 NonceManager._getOutboundNonce | 🎯🟢🟩 > 🔗 IEVM2AnyOnRamp.getSenderNonce | 💥🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burnFrom | 💥 > 🔗 Context._msgSender | 🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burnFrom | 💥 > 🔗 ERC20._burn | 🟢🔴
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burnFrom | 💥 > 🔗 ERC20._spendAllowance |
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burnFrom | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burnFrom | 💥
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burnFrom | 💥❌ ['onlyBurner'] > 🔗 FactoryBurnMintERC20.onlyBurner | 🌈
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 IBurnMintERC20.burnFrom | 💥
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burn | 💥 > 🔗 Context._msgSender | 🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burn | 💥 > 🔗 ERC20._burn | 🟢🔴
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burn | 💥
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner'] > 🔗 FactoryBurnMintERC20.onlyBurner | 🌈
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 IBurnMintERC20.burn | 💥
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPoolAbstract._burn |
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnWithFromMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥 > 🔗 FactoryBurnMintERC20.burnFrom | 💥❌ ['onlyBurner']
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnWithFromMintTokenPool._burn | 🟢 > 🔗 IBurnMintERC20.burn | 💥
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢 > 🔗 RateLimiter._consume |
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 IRouter.getOnRamp | 💥🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 Router.getOnRamp | 💥🟢🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 TokenPool.isSupportedChain | 💥🟢🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool.isSupportedToken | 💥🟢🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool.getRemoteToken | 💥🟢🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burn | 💥 > 🔗 Context._msgSender | 🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burn | 💥 > 🔗 ERC20._burn | 🟢🔴
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burn | 💥
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner'] > 🔗 FactoryBurnMintERC20.onlyBurner | 🌈
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 IBurnMintERC20.burn | 💥
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢 > 🔗 RateLimiter._consume |
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 IRouter.getOnRamp | 💥🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 Router.getOnRamp | 💥🟢🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 TokenPool.isSupportedChain | 💥🟢🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool.isSupportedToken | 💥🟢🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool.getRemoteToken | 💥🟢🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 CCIPHome.supportsInterface | 🎯💥🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 CCIPReceiver.supportsInterface | 💥🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 FactoryBurnMintERC20.supportsInterface | 💥🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool.isSupportedToken | 💥🟢🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool.getRemoteToken | 💥🟢🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool.shouldUseLockRelease | 💥🟢🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 ITokenMessenger.depositForBurnWithCaller | 💥
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool.isSupportedToken | 💥🟢🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool.getRemoteToken | 💥🟢🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 IERC165.supportsInterface | 💥🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 IERC165.supportsInterface | 💥🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 IPoolV1.lockOrBurn | 💥
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢 > 🔗 RateLimiter._consume |
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 IRouter.getOnRamp | 💥🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 Router.getOnRamp | 💥🟢🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 TokenPool.isSupportedChain | 💥🟢🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool.isSupportedToken | 💥🟢🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool.getRemoteToken | 💥🟢🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.supportsInterface | 💥🟩 > 🔗 TokenPool.supportsInterface | 💥🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 OnRamp.getPoolBySourceToken | 🎯💥🟢🟩 > 🔗 ITokenAdminRegistry.getPool | 💥🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 OnRamp.getPoolBySourceToken | 🎯💥🟢🟩 > 🔗 TokenAdminRegistry.getPool | 💥🟢🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 TokenPool.supportsInterface | 💥🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 ITokenMessenger.depositForBurnWithCaller | 💥
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢 > 🔗 RateLimiter._consume |
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 IRouter.getOnRamp | 💥🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 Router.getOnRamp | 💥🟢🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 TokenPool.isSupportedChain | 💥🟢🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool.isSupportedToken | 💥🟢🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool.getRemoteToken | 💥🟢🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getDataAvailabilityCost | 🎯🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenTransferCost | 🎯🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenTransferCost | 🎯🟢🟩 > 🔗 USDPriceWith18Decimals._calcUSDValueFromTokenAmount | 🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getValidatedGasPrice | 🎯🟢🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 AggregatorV3Interface.decimals | 💥🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 AggregatorV3Interface.latestRoundData | 💥🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 FeeQuoter._calculateRebasedValue | 🎯🟢🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._parseEVMExtraArgsFromBytes | 🎯🟩 > 🔗 FeeQuoter._parseUnvalidatedEVMExtraArgsFromBytes | 🎯🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._validateMessage | 🎯🟩 > 🔗 FeeQuoter._validateDestFamilyAddress | 🎯🟩 > 🔗 Internal._validateEVMAddress | 🎯🟢🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 IFeeQuoter.getValidatedFee | 🎯💥🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 IRMNRemote.isCursed | 🎯💥🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 RMNRemote.isCursed | 🎯💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 RMNRemote.isCursed | 🎯💥🟢🟩 > 🔗 EnumerableSet.length | 🟩 > 🔗 EnumerableSet._length | 🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getPoolBySourceToken | 🎯💥🟢🟩 > 🔗 ITokenAdminRegistry.getPool | 💥🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getPoolBySourceToken | 🎯💥🟢🟩 > 🔗 TokenAdminRegistry.getPool | 💥🟢🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 Router.whenNotCursed | 🌈🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 SafeERC20.safeTransfer | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address._revert | 🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 SafeERC20.safeTransfer | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address.isContract | 🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 SafeERC20.safeTransferFrom | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address._revert | 🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 SafeERC20.safeTransferFrom | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address.isContract | 🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.getFee | 💥🟢🟩 > 🔗 IEVM2AnyOnRampClient.getFee | 💥🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.getFee | 💥🟢🟩 > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.getFee | 💥🟢🟩 > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getDataAvailabilityCost | 🎯🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.getFee | 💥🟢🟩 > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenTransferCost | 🎯🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.getFee | 💥🟢🟩 > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenTransferCost | 🎯🟢🟩 > 🔗 USDPriceWith18Decimals._calcUSDValueFromTokenAmount | 🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.getFee | 💥🟢🟩 > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getValidatedGasPrice | 🎯🟢🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.getFee | 💥🟢🟩 > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 AggregatorV3Interface.decimals | 💥🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.getFee | 💥🟢🟩 > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 AggregatorV3Interface.latestRoundData | 💥🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.getFee | 💥🟢🟩 > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 FeeQuoter._calculateRebasedValue | 🎯🟢🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.getFee | 💥🟢🟩 > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._parseEVMExtraArgsFromBytes | 🎯🟩 > 🔗 FeeQuoter._parseUnvalidatedEVMExtraArgsFromBytes | 🎯🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.getFee | 💥🟢🟩 > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._validateMessage | 🎯🟩 > 🔗 FeeQuoter._validateDestFamilyAddress | 🎯🟩 > 🔗 Internal._validateEVMAddress | 🎯🟢🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.getFee | 💥🟢🟩 > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 IFeeQuoter.getValidatedFee | 🎯💥🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.getFee | 💥🟢🟩 > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 IRMNRemote.isCursed | 🎯💥🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.getFee | 💥🟢🟩 > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 RMNRemote.isCursed | 🎯💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 CCIPClientExample.sendDataPayNative | 💥🟢 ['validChain(uint64)'] > 🔗 Router.getFee | 💥🟢🟩 > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 RMNRemote.isCursed | 🎯💥🟢🟩 > 🔗 EnumerableSet.length | 🟩 > 🔗 EnumerableSet._length | 🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 CCIPClientExample.validChain | 🌈🟢
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 ERC20.approve | 💥 > 🔗 Context._msgSender | 🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 ERC20.approve | 💥 > 🔗 ERC20._approve | 🔴
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 ERC20.approve | 💥 > 🔗 FactoryBurnMintERC20._approve | ['validAddress(address)'] > 🔗 ERC20._approve | 🔴
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 ERC20.approve | 💥 > 🔗 FactoryBurnMintERC20._approve | ['validAddress(address)'] > 🔗 FactoryBurnMintERC20.validAddress | 🌈
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 ERC20.transferFrom | 💥 > 🔗 Context._msgSender | 🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 ERC20.transferFrom | 💥 > 🔗 ERC20._spendAllowance |
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 ERC20.transferFrom | 💥 > 🔗 ERC20._spendAllowance | > 🔗 ERC20._approve | 🔴
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 ERC20.transferFrom | 💥 > 🔗 ERC20._spendAllowance | > 🔗 ERC20.allowance | 💥🟢🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 ERC20.transferFrom | 💥 > 🔗 ERC20._spendAllowance | > 🔗 FactoryBurnMintERC20._approve | ['validAddress(address)'] > 🔗 ERC20._approve | 🔴
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 ERC20.transferFrom | 💥 > 🔗 ERC20._spendAllowance | > 🔗 FactoryBurnMintERC20._approve | ['validAddress(address)'] > 🔗 FactoryBurnMintERC20.validAddress | 🌈
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 ERC20.transferFrom | 💥 > 🔗 ERC20._transfer | 🟢🔴 > 🔗 ERC20._afterTokenTransfer |
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 ERC20.transferFrom | 💥 > 🔗 ERC20._transfer | 🟢🔴 > 🔗 ERC20._beforeTokenTransfer |
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 ERC20.transferFrom | 💥 > 🔗 FactoryBurnMintERC20._transfer | ['validAddress(address)'] > 🔗 ERC20._transfer | 🟢🔴 > 🔗 ERC20._afterTokenTransfer |
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 ERC20.transferFrom | 💥 > 🔗 FactoryBurnMintERC20._transfer | ['validAddress(address)'] > 🔗 ERC20._transfer | 🟢🔴 > 🔗 ERC20._beforeTokenTransfer |
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 ERC20.transferFrom | 💥 > 🔗 FactoryBurnMintERC20._transfer | ['validAddress(address)'] > 🔗 FactoryBurnMintERC20.validAddress | 🌈
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 IERC20.approve | 💥
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 IERC20.transferFrom | 💥
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 IRouterClient.ccipSend | 💥💲
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 IEVM2AnyOnRampClient.forwardFromRouter | 💥
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 IEVM2AnyOnRampClient.getFee | 💥🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 IEVM2AnyOnRampClient.getPoolBySourceToken | 💥🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 IWrappedNative.deposit | 💥💲
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 FeeQuoter.processMessageArgs | 🎯💥🟢🟩 > 🔗 Client._argsToBytes | 🎯🟢🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 FeeQuoter.processMessageArgs | 🎯💥🟢🟩 > 🔗 FeeQuoter._parseUnvalidatedEVMExtraArgsFromBytes | 🎯🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 FeeQuoter.processMessageArgs | 🎯💥🟢🟩 > 🔗 FeeQuoter._processPoolReturnData | 🎯🟢🟩 > 🔗 FeeQuoter._validateDestFamilyAddress | 🎯🟩 > 🔗 Internal._validateEVMAddress | 🎯🟢🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 FeeQuoter.processMessageArgs | 🎯💥🟢🟩 > 🔗 FeeQuoter.convertTokenAmount | 🎯💥🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 IFeeQuoter.processMessageArgs | 🎯💥🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 IMessageInterceptor.onOutboundMessage | 🎯💥
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 INonceManager.getIncrementedOutboundNonce | 🎯💥
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 Internal._hash | 🎯🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 AuthorizedCallers.onlyAuthorizedCallers | 🌈 > 🔗 AuthorizedCallers._validateCaller | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 EnumerableMapAddresses.contains | 🟩 > 🔗 EnumerableMapBytes32.contains | 🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 MultiAggregateRateLimiter._getTokenBucket | 🎯🟢🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 MultiAggregateRateLimiter._getTokenValue | 🎯🟢🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 MultiAggregateRateLimiter._getTokenValue | 🎯🟢🟩 > 🔗 IPriceRegistry.getTokenPrice | 💥🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 MultiAggregateRateLimiter._getTokenValue | 🎯🟢🟩 > 🔗 USDPriceWith18Decimals._calcUSDValueFromTokenAmount | 🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 RateLimiter._consume | > 🔗 RateLimiter._calculateRefill | 🟩 > 🔗 RateLimiter._min | 🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 NonceManager.getIncrementedOutboundNonce | 🎯💥🔴❌ ['onlyAuthorizedCallers'] > 🔗 AuthorizedCallers.onlyAuthorizedCallers | 🌈 > 🔗 AuthorizedCallers._validateCaller | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 NonceManager.getIncrementedOutboundNonce | 🎯💥🔴❌ ['onlyAuthorizedCallers'] > 🔗 NonceManager._getOutboundNonce | 🎯🟢🟩 > 🔗 IEVM2AnyOnRamp.getSenderNonce | 💥🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burnFrom | 💥 > 🔗 Context._msgSender | 🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burnFrom | 💥 > 🔗 ERC20._burn | 🟢🔴
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burnFrom | 💥 > 🔗 ERC20._spendAllowance |
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burnFrom | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burnFrom | 💥
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burnFrom | 💥❌ ['onlyBurner'] > 🔗 FactoryBurnMintERC20.onlyBurner | 🌈
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 IBurnMintERC20.burnFrom | 💥
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burn | 💥 > 🔗 Context._msgSender | 🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burn | 💥 > 🔗 ERC20._burn | 🟢🔴
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burn | 💥
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner'] > 🔗 FactoryBurnMintERC20.onlyBurner | 🌈
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 IBurnMintERC20.burn | 💥
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPoolAbstract._burn |
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnWithFromMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥 > 🔗 FactoryBurnMintERC20.burnFrom | 💥❌ ['onlyBurner']
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnWithFromMintTokenPool._burn | 🟢 > 🔗 IBurnMintERC20.burn | 💥
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢 > 🔗 RateLimiter._consume |
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 IRouter.getOnRamp | 💥🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 Router.getOnRamp | 💥🟢🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 TokenPool.isSupportedChain | 💥🟢🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool.isSupportedToken | 💥🟢🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool.getRemoteToken | 💥🟢🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burn | 💥 > 🔗 Context._msgSender | 🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burn | 💥 > 🔗 ERC20._burn | 🟢🔴
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burn | 💥
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner'] > 🔗 FactoryBurnMintERC20.onlyBurner | 🌈
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 IBurnMintERC20.burn | 💥
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢 > 🔗 RateLimiter._consume |
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 IRouter.getOnRamp | 💥🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 Router.getOnRamp | 💥🟢🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 TokenPool.isSupportedChain | 💥🟢🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool.isSupportedToken | 💥🟢🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool.getRemoteToken | 💥🟢🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 CCIPHome.supportsInterface | 🎯💥🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 CCIPReceiver.supportsInterface | 💥🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 FactoryBurnMintERC20.supportsInterface | 💥🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool.isSupportedToken | 💥🟢🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool.getRemoteToken | 💥🟢🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool.shouldUseLockRelease | 💥🟢🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 ITokenMessenger.depositForBurnWithCaller | 💥
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool.isSupportedToken | 💥🟢🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool.getRemoteToken | 💥🟢🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 IERC165.supportsInterface | 💥🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 IERC165.supportsInterface | 💥🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 IPoolV1.lockOrBurn | 💥
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢 > 🔗 RateLimiter._consume |
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 IRouter.getOnRamp | 💥🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 Router.getOnRamp | 💥🟢🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 TokenPool.isSupportedChain | 💥🟢🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool.isSupportedToken | 💥🟢🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool.getRemoteToken | 💥🟢🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.supportsInterface | 💥🟩 > 🔗 TokenPool.supportsInterface | 💥🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 OnRamp.getPoolBySourceToken | 🎯💥🟢🟩 > 🔗 ITokenAdminRegistry.getPool | 💥🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 OnRamp.getPoolBySourceToken | 🎯💥🟢🟩 > 🔗 TokenAdminRegistry.getPool | 💥🟢🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 TokenPool.supportsInterface | 💥🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 ITokenMessenger.depositForBurnWithCaller | 💥
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢 > 🔗 RateLimiter._consume |
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 IRouter.getOnRamp | 💥🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 Router.getOnRamp | 💥🟢🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 TokenPool.isSupportedChain | 💥🟢🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool.isSupportedToken | 💥🟢🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool.getRemoteToken | 💥🟢🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getDataAvailabilityCost | 🎯🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenTransferCost | 🎯🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenTransferCost | 🎯🟢🟩 > 🔗 USDPriceWith18Decimals._calcUSDValueFromTokenAmount | 🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getValidatedGasPrice | 🎯🟢🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 AggregatorV3Interface.decimals | 💥🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 AggregatorV3Interface.latestRoundData | 💥🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 FeeQuoter._calculateRebasedValue | 🎯🟢🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._parseEVMExtraArgsFromBytes | 🎯🟩 > 🔗 FeeQuoter._parseUnvalidatedEVMExtraArgsFromBytes | 🎯🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._validateMessage | 🎯🟩 > 🔗 FeeQuoter._validateDestFamilyAddress | 🎯🟩 > 🔗 Internal._validateEVMAddress | 🎯🟢🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 IFeeQuoter.getValidatedFee | 🎯💥🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 IRMNRemote.isCursed | 🎯💥🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 RMNRemote.isCursed | 🎯💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 RMNRemote.isCursed | 🎯💥🟢🟩 > 🔗 EnumerableSet.length | 🟩 > 🔗 EnumerableSet._length | 🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getPoolBySourceToken | 🎯💥🟢🟩 > 🔗 ITokenAdminRegistry.getPool | 💥🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getPoolBySourceToken | 🎯💥🟢🟩 > 🔗 TokenAdminRegistry.getPool | 💥🟢🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 Router.whenNotCursed | 🌈🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 SafeERC20.safeTransfer | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address._revert | 🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 SafeERC20.safeTransfer | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address.isContract | 🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 SafeERC20.safeTransferFrom | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address._revert | 🟩
🔗 CCIPClientExample.sendTokens | 💥🟢 ['validChain(uint64)'] > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 SafeERC20.safeTransferFrom | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address.isContract | 🟩
🔗 CCIPHome.applyChainConfigUpdates | 🎯💥🟢🔴❌ ['onlyOwner'] > 🔗 CCIPHome._ensureInRegistry | 🎯🟢🟩 > 🔗 INodeInfoProvider.getNodesByP2PIds | 💥🟩
🔗 CCIPHome.applyChainConfigUpdates | 🎯💥🟢🔴❌ ['onlyOwner'] > 🔗 EnumerableSet.add | > 🔗 EnumerableSet._add | > 🔗 EnumerableSet._contains | 🟩
🔗 CCIPHome.applyChainConfigUpdates | 🎯💥🟢🔴❌ ['onlyOwner'] > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 CCIPHome.applyChainConfigUpdates | 🎯💥🟢🔴❌ ['onlyOwner'] > 🔗 EnumerableSet.remove | > 🔗 EnumerableSet._remove |
🔗 CCIPHome.applyChainConfigUpdates | 🎯💥🟢🔴❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 CCIPHome.getActiveDigest | 🎯💥🟢🟩 > 🔗 CCIPHome._getActiveIndex | 🎯🟢🟩
🔗 CCIPHome.getAllChainConfigs | 🎯💥🟢🟩 > 🔗 EnumerableSet.at | 🟩 > 🔗 EnumerableSet._at | 🟩
🔗 CCIPHome.getAllChainConfigs | 🎯💥🟢🟩 > 🔗 EnumerableSet.length | 🟩 > 🔗 EnumerableSet._length | 🟩
🔗 CCIPHome.getAllConfigs | 🎯💥🟢🟩 > 🔗 CCIPHome._getActiveIndex | 🎯🟢🟩
🔗 CCIPHome.getAllConfigs | 🎯💥🟢🟩 > 🔗 CCIPHome._getCandidateIndex | 🎯🟢🟩
🔗 CCIPHome.getConfigDigests | 🎯💥🟢🟩 > 🔗 CCIPHome._getActiveIndex | 🎯🟢🟩
🔗 CCIPHome.getConfigDigests | 🎯💥🟢🟩 > 🔗 CCIPHome._getCandidateIndex | 🎯🟢🟩
🔗 CCIPHome.getNumChainConfigurations | 🎯💥🟢🟩 > 🔗 EnumerableSet.length | 🟩 > 🔗 EnumerableSet._length | 🟩
🔗 CCIPHome.promoteCandidateAndRevokeActive | 🎯💥🟢🔴 > 🔗 CCIPHome._getActiveIndex | 🎯🟢🟩
🔗 CCIPHome.promoteCandidateAndRevokeActive | 🎯💥🟢🔴 > 🔗 CCIPHome._getCandidateIndex | 🎯🟢🟩
🔗 CCIPHome.promoteCandidateAndRevokeActive | 🎯💥🟢🔴 > 🔗 CCIPHome._onlySelfCall | 🎯🟩
🔗 CCIPHome.revokeCandidate | 🎯💥🟢🔴 > 🔗 CCIPHome._getCandidateIndex | 🎯🟢🟩
🔗 CCIPHome.revokeCandidate | 🎯💥🟢🔴 > 🔗 CCIPHome._onlySelfCall | 🎯🟩
🔗 CCIPHome.setCandidate | 🎯💥🟢🔴 > 🔗 CCIPHome._calculateConfigDigest | 🎯🟢🟩
🔗 CCIPHome.setCandidate | 🎯💥🟢🔴 > 🔗 CCIPHome._getCandidateIndex | 🎯🟢🟩
🔗 CCIPHome.setCandidate | 🎯💥🟢🔴 > 🔗 CCIPHome._onlySelfCall | 🎯🟩
🔗 CCIPHome.setCandidate | 🎯💥🟢🔴 > 🔗 CCIPHome._validateConfig | 🎯🟢🟩 > 🔗 CCIPHome._ensureInRegistry | 🎯🟢🟩 > 🔗 INodeInfoProvider.getNodesByP2PIds | 💥🟩
🔗 CCIPHome.setCandidate | 🎯💥🟢🔴 > 🔗 CCIPHome._validateConfig | 🎯🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 CCIPHome.setCandidate | 🎯💥🟢🔴 > 🔗 CCIPHome.getCandidateDigest | 🎯💥🟢🟩 > 🔗 CCIPHome._getCandidateIndex | 🎯🟢🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 CCIPClientExample._ccipReceive |
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 CCIPReceiver._ccipReceive |
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 CCIPReceiver.onlyRouter | 🌈 > 🔗 CCIPReceiver.getRouter | 💥🟢🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 EtherSenderReceiver._ccipReceive | 🟢❗ > 🔗 ERC20.transfer | 💥 > 🔗 Context._msgSender | 🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 EtherSenderReceiver._ccipReceive | 🟢❗ > 🔗 ERC20.transfer | 💥 > 🔗 ERC20._transfer | 🟢🔴 > 🔗 ERC20._afterTokenTransfer |
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 EtherSenderReceiver._ccipReceive | 🟢❗ > 🔗 ERC20.transfer | 💥 > 🔗 ERC20._transfer | 🟢🔴 > 🔗 ERC20._beforeTokenTransfer |
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 EtherSenderReceiver._ccipReceive | 🟢❗ > 🔗 ERC20.transfer | 💥 > 🔗 FactoryBurnMintERC20._transfer | ['validAddress(address)'] > 🔗 ERC20._transfer | 🟢🔴 > 🔗 ERC20._afterTokenTransfer |
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 EtherSenderReceiver._ccipReceive | 🟢❗ > 🔗 ERC20.transfer | 💥 > 🔗 FactoryBurnMintERC20._transfer | ['validAddress(address)'] > 🔗 ERC20._transfer | 🟢🔴 > 🔗 ERC20._beforeTokenTransfer |
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 EtherSenderReceiver._ccipReceive | 🟢❗ > 🔗 ERC20.transfer | 💥 > 🔗 FactoryBurnMintERC20._transfer | ['validAddress(address)'] > 🔗 FactoryBurnMintERC20.validAddress | 🌈
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 EtherSenderReceiver._ccipReceive | 🟢❗ > 🔗 IERC20.transfer | 💥
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 EtherSenderReceiver._ccipReceive | 🟢❗ > 🔗 IWrappedNative.deposit | 💥💲
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 EtherSenderReceiver._ccipReceive | 🟢❗ > 🔗 IWrappedNative.withdraw | 💥
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 CCIPReceiver.getRouter | 💥🟢🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Client._argsToBytes | 🎯🟢🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 IRouterClient.ccipSend | 💥💲
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 IEVM2AnyOnRampClient.forwardFromRouter | 💥
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 IEVM2AnyOnRampClient.getFee | 💥🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 IEVM2AnyOnRampClient.getPoolBySourceToken | 💥🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 IWrappedNative.deposit | 💥💲
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 FeeQuoter.processMessageArgs | 🎯💥🟢🟩 > 🔗 Client._argsToBytes | 🎯🟢🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 FeeQuoter.processMessageArgs | 🎯💥🟢🟩 > 🔗 FeeQuoter._parseUnvalidatedEVMExtraArgsFromBytes | 🎯🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 FeeQuoter.processMessageArgs | 🎯💥🟢🟩 > 🔗 FeeQuoter._processPoolReturnData | 🎯🟢🟩 > 🔗 FeeQuoter._validateDestFamilyAddress | 🎯🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 FeeQuoter.processMessageArgs | 🎯💥🟢🟩 > 🔗 FeeQuoter.convertTokenAmount | 🎯💥🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 IFeeQuoter.processMessageArgs | 🎯💥🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 IMessageInterceptor.onOutboundMessage | 🎯💥
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 INonceManager.getIncrementedOutboundNonce | 🎯💥
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 Internal._hash | 🎯🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 AuthorizedCallers.onlyAuthorizedCallers | 🌈 > 🔗 AuthorizedCallers._validateCaller | 🟢🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 EnumerableMapAddresses.contains | 🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 MultiAggregateRateLimiter._getTokenBucket | 🎯🟢🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 MultiAggregateRateLimiter._getTokenValue | 🎯🟢🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 RateLimiter._consume |
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 NonceManager.getIncrementedOutboundNonce | 🎯💥🔴❌ ['onlyAuthorizedCallers'] > 🔗 AuthorizedCallers.onlyAuthorizedCallers | 🌈 > 🔗 AuthorizedCallers._validateCaller | 🟢🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 NonceManager.getIncrementedOutboundNonce | 🎯💥🔴❌ ['onlyAuthorizedCallers'] > 🔗 NonceManager._getOutboundNonce | 🎯🟢🟩 > 🔗 IEVM2AnyOnRamp.getSenderNonce | 💥🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPoolAbstract._burn |
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnWithFromMintTokenPool._burn | 🟢
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool.getRemoteToken | 💥🟢🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool.getRemoteToken | 💥🟢🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 CCIPHome.supportsInterface | 🎯💥🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 CCIPReceiver.supportsInterface | 💥🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 FactoryBurnMintERC20.supportsInterface | 💥🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool.shouldUseLockRelease | 💥🟢🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 IERC165.supportsInterface | 💥🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 IERC165.supportsInterface | 💥🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 IPoolV1.lockOrBurn | 💥
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool.getRemoteToken | 💥🟢🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.supportsInterface | 💥🟩 > 🔗 TokenPool.supportsInterface | 💥🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 OnRamp.getPoolBySourceToken | 🎯💥🟢🟩 > 🔗 ITokenAdminRegistry.getPool | 💥🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 OnRamp.getPoolBySourceToken | 🎯💥🟢🟩 > 🔗 TokenAdminRegistry.getPool | 💥🟢🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 TokenPool.supportsInterface | 💥🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 ITokenMessenger.depositForBurnWithCaller | 💥
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool.getRemoteToken | 💥🟢🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getDataAvailabilityCost | 🎯🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenTransferCost | 🎯🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenTransferCost | 🎯🟢🟩 > 🔗 USDPriceWith18Decimals._calcUSDValueFromTokenAmount | 🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getValidatedGasPrice | 🎯🟢🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._parseEVMExtraArgsFromBytes | 🎯🟩 > 🔗 FeeQuoter._parseUnvalidatedEVMExtraArgsFromBytes | 🎯🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._validateMessage | 🎯🟩 > 🔗 FeeQuoter._validateDestFamilyAddress | 🎯🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 IFeeQuoter.getValidatedFee | 🎯💥🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 IRMNRemote.isCursed | 🎯💥🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 RMNRemote.isCursed | 🎯💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 RMNRemote.isCursed | 🎯💥🟢🟩 > 🔗 EnumerableSet.length | 🟩 > 🔗 EnumerableSet._length | 🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getPoolBySourceToken | 🎯💥🟢🟩 > 🔗 ITokenAdminRegistry.getPool | 💥🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getPoolBySourceToken | 🎯💥🟢🟩 > 🔗 TokenAdminRegistry.getPool | 💥🟢🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 Router.whenNotCursed | 🌈🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 SafeERC20.safeTransfer | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗
🔗 CCIPReceiver.ccipReceive | 💥❌ ['onlyRouter'] > 🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 SafeERC20.safeTransferFrom | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗
🔗 ConfirmedOwner.constructor | 💥 > 🔗 ConfirmedOwnerWithProposal.constructor | 💥🔴 > 🔗 ConfirmedOwnerWithProposal._transferOwnership | 🟢🔴
🔗 ConfirmedOwnerWithProposal.constructor | 💥🔴 > 🔗 ConfirmedOwnerWithProposal._transferOwnership | 🟢🔴
🔗 Create2.computeAddress | 🟩 > 🔗 Create2.computeAddress | 🟩
🔗 DefensiveExample.ccipReceive | 💥🟢🔴❌ ['onlyRouter', 'validChain(uint64)'] > 🔗 CCIPClientExample.validChain | 🌈🟢
🔗 DefensiveExample.ccipReceive | 💥🟢🔴❌ ['onlyRouter', 'validChain(uint64)'] > 🔗 CCIPReceiver.onlyRouter | 🌈 > 🔗 CCIPReceiver.getRouter | 💥🟢🟩
🔗 DefensiveExample.ccipReceive | 💥🟢🔴❌ ['onlyRouter', 'validChain(uint64)'] > 🔗 DefensiveExample.processMessage | 💥🟢❌ ['onlySelf', 'validChain(uint64)'] > 🔗 CCIPClientExample.validChain | 🌈🟢
🔗 DefensiveExample.ccipReceive | 💥🟢🔴❌ ['onlyRouter', 'validChain(uint64)'] > 🔗 DefensiveExample.processMessage | 💥🟢❌ ['onlySelf', 'validChain(uint64)'] > 🔗 DefensiveExample.onlySelf | 🌈
🔗 DefensiveExample.ccipReceive | 💥🟢🔴❌ ['onlyRouter', 'validChain(uint64)'] > 🔗 DefensiveExample.processMessage | 💥🟢❌ ['onlySelf', 'validChain(uint64)'] > 🔗 Ownable2Step.owner | 💥🟢🟩
🔗 DefensiveExample.ccipReceive | 💥🟢🔴❌ ['onlyRouter', 'validChain(uint64)'] > 🔗 DefensiveExample.processMessage | 💥🟢❌ ['onlySelf', 'validChain(uint64)'] > 🔗 SafeERC20.safeTransfer | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address._revert | 🟩
🔗 DefensiveExample.ccipReceive | 💥🟢🔴❌ ['onlyRouter', 'validChain(uint64)'] > 🔗 DefensiveExample.processMessage | 💥🟢❌ ['onlySelf', 'validChain(uint64)'] > 🔗 SafeERC20.safeTransfer | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address.isContract | 🟩
🔗 DefensiveExample.ccipReceive | 💥🟢🔴❌ ['onlyRouter', 'validChain(uint64)'] > 🔗 EnumerableMap.set | > 🔗 EnumerableMap.set | > 🔗 EnumerableSet.add | > 🔗 EnumerableSet._add | > 🔗 EnumerableSet._contains | 🟩
🔗 DefensiveExample.constructor | 💥 > 🔗 CCIPClientExample.constructor | 💥🟢🔴 > 🔗 CCIPReceiver.constructor | 🔴
🔗 DefensiveExample.constructor | 💥 > 🔗 CCIPClientExample.constructor | 💥🟢🔴 > 🔗 ERC20.approve | 💥
🔗 DefensiveExample.constructor | 💥 > 🔗 CCIPClientExample.constructor | 💥🟢🔴 > 🔗 ERC20.approve | 💥 > 🔗 Context._msgSender | 🟩
🔗 DefensiveExample.constructor | 💥 > 🔗 CCIPClientExample.constructor | 💥🟢🔴 > 🔗 ERC20.approve | 💥 > 🔗 ERC20._approve | 🔴
🔗 DefensiveExample.constructor | 💥 > 🔗 CCIPClientExample.constructor | 💥🟢🔴 > 🔗 ERC20.approve | 💥 > 🔗 FactoryBurnMintERC20._approve | ['validAddress(address)'] > 🔗 ERC20._approve | 🔴
🔗 DefensiveExample.constructor | 💥 > 🔗 CCIPClientExample.constructor | 💥🟢🔴 > 🔗 ERC20.approve | 💥 > 🔗 FactoryBurnMintERC20._approve | ['validAddress(address)'] > 🔗 FactoryBurnMintERC20.validAddress | 🌈
🔗 DefensiveExample.constructor | 💥 > 🔗 CCIPClientExample.constructor | 💥🟢🔴 > 🔗 IERC20.approve | 💥
🔗 DefensiveExample.retryFailedMessage | 💥🟢❌ ['onlyOwner'] > 🔗 EnumerableMap.get | 🟩 > 🔗 EnumerableMap.get | 🟩 > 🔗 EnumerableMap.contains | 🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 DefensiveExample.retryFailedMessage | 💥🟢❌ ['onlyOwner'] > 🔗 EnumerableMap.set | > 🔗 EnumerableMap.set | > 🔗 EnumerableSet.add | > 🔗 EnumerableSet._add | > 🔗 EnumerableSet._contains | 🟩
🔗 DefensiveExample.retryFailedMessage | 💥🟢❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 DefensiveExample.retryFailedMessage | 💥🟢❌ ['onlyOwner'] > 🔗 SafeERC20.safeTransfer | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address._revert | 🟩
🔗 DefensiveExample.retryFailedMessage | 💥🟢❌ ['onlyOwner'] > 🔗 SafeERC20.safeTransfer | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address.isContract | 🟩
🔗 DefensiveExample.setSimRevert | 💥🔴❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 ERC165Checker.getSupportedInterfaces | 🟩 > 🔗 ERC165Checker.supportsERC165 | 🟢🟩 > 🔗 ERC165Checker.supportsERC165InterfaceUnchecked | 🟩
🔗 ERC165Checker.getSupportedInterfaces | 🟩 > 🔗 ERC165Checker.supportsERC165InterfaceUnchecked | 🟩
🔗 ERC165Checker.supportsAllInterfaces | 🟩 > 🔗 ERC165Checker.supportsERC165 | 🟢🟩 > 🔗 ERC165Checker.supportsERC165InterfaceUnchecked | 🟩
🔗 ERC165Checker.supportsAllInterfaces | 🟩 > 🔗 ERC165Checker.supportsERC165InterfaceUnchecked | 🟩
🔗 ERC20.decreaseAllowance | 💥 > 🔗 ERC20._approve | 🔴
🔗 ERC20.increaseAllowance | 💥 > 🔗 ERC20._approve | 🔴
🔗 ERC20.transfer | 💥 > 🔗 Context._msgSender | 🟩
🔗 ERC20.transfer | 💥 > 🔗 ERC20._transfer | 🟢🔴 > 🔗 ERC20._afterTokenTransfer |
🔗 ERC20.transferFrom | 💥 > 🔗 Context._msgSender | 🟩
🔗 ERC20.transferFrom | 💥 > 🔗 ERC20._spendAllowance | > 🔗 ERC20._approve | 🔴
🔗 ERC20Burnable.burnFrom | 💥 > 🔗 ERC20._spendAllowance | > 🔗 ERC20._approve | 🔴
🔗 EnumerableMap.at | 🟩 > 🔗 EnumerableMap.at | 🟩 > 🔗 EnumerableSet.at | 🟩 > 🔗 EnumerableSet._at | 🟩
🔗 EnumerableMap.at | 🟩 > 🔗 EnumerableMap.at | 🟩 > 🔗 EnumerableSet.at | 🟩 > 🔗 EnumerableSet._at | 🟩
🔗 EnumerableMap.at | 🟩 > 🔗 EnumerableMap.at | 🟩 > 🔗 EnumerableSet.at | 🟩 > 🔗 EnumerableSet._at | 🟩
🔗 EnumerableMap.contains | 🟩 > 🔗 EnumerableMap.contains | 🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 EnumerableMap.contains | 🟩 > 🔗 EnumerableMap.contains | 🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 EnumerableMap.contains | 🟩 > 🔗 EnumerableMap.contains | 🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 EnumerableMap.get | 🟩 > 🔗 EnumerableMap.get | 🟩 > 🔗 EnumerableMap.contains | 🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 EnumerableMap.get | 🟩 > 🔗 EnumerableMap.get | 🟩 > 🔗 EnumerableMap.contains | 🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 EnumerableMap.get | 🟩 > 🔗 EnumerableMap.get | 🟩 > 🔗 EnumerableMap.contains | 🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 EnumerableMap.get | 🟩 > 🔗 EnumerableMap.get | 🟩 > 🔗 EnumerableMap.contains | 🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 EnumerableMap.get | 🟩 > 🔗 EnumerableMap.get | 🟩 > 🔗 EnumerableMap.contains | 🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 EnumerableMap.length | 🟩 > 🔗 EnumerableMap.length | 🟩 > 🔗 EnumerableSet.length | 🟩 > 🔗 EnumerableSet._length | 🟩
🔗 EnumerableMap.length | 🟩 > 🔗 EnumerableMap.length | 🟩 > 🔗 EnumerableSet.length | 🟩 > 🔗 EnumerableSet._length | 🟩
🔗 EnumerableMap.length | 🟩 > 🔗 EnumerableMap.length | 🟩 > 🔗 EnumerableSet.length | 🟩 > 🔗 EnumerableSet._length | 🟩
🔗 EnumerableMap.remove | > 🔗 EnumerableMap.remove | > 🔗 EnumerableSet.remove | > 🔗 EnumerableSet._remove |
🔗 EnumerableMap.remove | > 🔗 EnumerableMap.remove | > 🔗 EnumerableSet.remove | > 🔗 EnumerableSet._remove |
🔗 EnumerableMap.remove | > 🔗 EnumerableMap.remove | > 🔗 EnumerableSet.remove | > 🔗 EnumerableSet._remove |
🔗 EnumerableMap.set | > 🔗 EnumerableMap.set | > 🔗 EnumerableSet.add | > 🔗 EnumerableSet._add | > 🔗 EnumerableSet._contains | 🟩
🔗 EnumerableMap.set | > 🔗 EnumerableMap.set | > 🔗 EnumerableSet.add | > 🔗 EnumerableSet._add | > 🔗 EnumerableSet._contains | 🟩
🔗 EnumerableMap.tryGet | 🟩 > 🔗 EnumerableMap.tryGet | 🟩 > 🔗 EnumerableMap.contains | 🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 EnumerableMap.tryGet | 🟩 > 🔗 EnumerableMap.tryGet | 🟩 > 🔗 EnumerableMap.contains | 🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 EnumerableMap.tryGet | 🟩 > 🔗 EnumerableMap.tryGet | 🟩 > 🔗 EnumerableMap.contains | 🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 EnumerableMapAddresses.at | 🟩 > 🔗 EnumerableMap.at | 🟩 > 🔗 EnumerableMap.at | 🟩 > 🔗 EnumerableSet.at | 🟩 > 🔗 EnumerableSet._at | 🟩
🔗 EnumerableMapAddresses.at | 🟩 > 🔗 EnumerableMap.at | 🟩 > 🔗 EnumerableSet.at | 🟩 > 🔗 EnumerableSet._at | 🟩
🔗 EnumerableMapAddresses.contains | 🟩 > 🔗 EnumerableMap.contains | 🟩 > 🔗 EnumerableMap.contains | 🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 EnumerableMapAddresses.contains | 🟩 > 🔗 EnumerableMap.contains | 🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 EnumerableMapAddresses.get | 🟩 > 🔗 EnumerableMap.get | 🟩 > 🔗 EnumerableMap.contains | 🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 EnumerableMapAddresses.get | 🟩 > 🔗 EnumerableMap.get | 🟩 > 🔗 EnumerableMap.get | 🟩 > 🔗 EnumerableMap.contains | 🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 EnumerableMapAddresses.get | 🟩 > 🔗 EnumerableMap.get | 🟩 > 🔗 EnumerableMap.get | 🟩 > 🔗 EnumerableMap.contains | 🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 EnumerableMapAddresses.get | 🟩 > 🔗 EnumerableMapBytes32.get | 🟩 > 🔗 EnumerableMapBytes32.contains | 🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 EnumerableMapAddresses.length | 🟩 > 🔗 EnumerableMap.length | 🟩 > 🔗 EnumerableMap.length | 🟩 > 🔗 EnumerableSet.length | 🟩 > 🔗 EnumerableSet._length | 🟩
🔗 EnumerableMapAddresses.length | 🟩 > 🔗 EnumerableMap.length | 🟩 > 🔗 EnumerableSet.length | 🟩 > 🔗 EnumerableSet._length | 🟩
🔗 EnumerableMapAddresses.remove | > 🔗 EnumerableMap.remove | > 🔗 EnumerableMap.remove | > 🔗 EnumerableSet.remove | > 🔗 EnumerableSet._remove |
🔗 EnumerableMapAddresses.remove | > 🔗 EnumerableMap.remove | > 🔗 EnumerableSet.remove | > 🔗 EnumerableSet._remove |
🔗 EnumerableMapAddresses.set | > 🔗 EnumerableMap.set | > 🔗 EnumerableMap.set | > 🔗 EnumerableSet.add | > 🔗 EnumerableSet._add | > 🔗 EnumerableSet._contains | 🟩
🔗 EnumerableMapAddresses.set | > 🔗 EnumerableMap.set | > 🔗 EnumerableSet.add | > 🔗 EnumerableSet._add | > 🔗 EnumerableSet._contains | 🟩
🔗 EnumerableMapAddresses.tryGet | 🟩 > 🔗 EnumerableMap.tryGet | 🟩 > 🔗 EnumerableMap.contains | 🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 EnumerableMapAddresses.tryGet | 🟩 > 🔗 EnumerableMap.tryGet | 🟩 > 🔗 EnumerableMap.tryGet | 🟩 > 🔗 EnumerableMap.contains | 🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 EnumerableMapAddresses.tryGet | 🟩 > 🔗 EnumerableMapBytes32.tryGet | 🟩 > 🔗 EnumerableMapBytes32.contains | 🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 EnumerableSet.add | > 🔗 EnumerableSet._add | > 🔗 EnumerableSet._contains | 🟩
🔗 EnumerableSet.add | > 🔗 EnumerableSet._add | > 🔗 EnumerableSet._contains | 🟩
🔗 EnumerableSet.add | > 🔗 EnumerableSet._add | > 🔗 EnumerableSet._contains | 🟩
🔗 EnumerableSet.add | > 🔗 EnumerableSet._add | > 🔗 EnumerableSet._contains | 🟩
🔗 EnumerableSet.at | 🟩 > 🔗 EnumerableSet._at | 🟩
🔗 EnumerableSet.at | 🟩 > 🔗 EnumerableSet._at | 🟩
🔗 EnumerableSet.at | 🟩 > 🔗 EnumerableSet._at | 🟩
🔗 EnumerableSet.at | 🟩 > 🔗 EnumerableSet._at | 🟩
🔗 EnumerableSet.at | 🟩 > 🔗 EnumerableSet._at | 🟩
🔗 EnumerableSet.at | 🟩 > 🔗 EnumerableSet._at | 🟩
🔗 EnumerableSet.at | 🟩 > 🔗 EnumerableSet._at | 🟩
🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 EnumerableSet.length | 🟩 > 🔗 EnumerableSet._length | 🟩
🔗 EnumerableSet.length | 🟩 > 🔗 EnumerableSet._length | 🟩
🔗 EnumerableSet.length | 🟩 > 🔗 EnumerableSet._length | 🟩
🔗 EnumerableSet.length | 🟩 > 🔗 EnumerableSet._length | 🟩
🔗 EnumerableSet.length | 🟩 > 🔗 EnumerableSet._length | 🟩
🔗 EnumerableSet.length | 🟩 > 🔗 EnumerableSet._length | 🟩
🔗 EnumerableSet.remove | > 🔗 EnumerableSet._remove |
🔗 EnumerableSet.remove | > 🔗 EnumerableSet._remove |
🔗 EnumerableSet.remove | > 🔗 EnumerableSet._remove |
🔗 EnumerableSet.remove | > 🔗 EnumerableSet._remove |
🔗 EnumerableSet.remove | > 🔗 EnumerableSet._remove |
🔗 EnumerableSet.values | 🟩 > 🔗 EnumerableSet._values | 🟩
🔗 EnumerableSet.values | 🟩 > 🔗 EnumerableSet._values | 🟩
🔗 EnumerableSet.values | 🟩 > 🔗 EnumerableSet._values | 🟩
🔗 EnumerableSet.values | 🟩 > 🔗 EnumerableSet._values | 🟩
🔗 EnumerableSet.values | 🟩 > 🔗 EnumerableSet._values | 🟩
🔗 EnumerableSet.values | 🟩 > 🔗 EnumerableSet._values | 🟩
🔗 EtherSenderReceiver._ccipReceive | 🟢❗ > 🔗 ERC20.transfer | 💥 > 🔗 Context._msgSender | 🟩
🔗 EtherSenderReceiver._ccipReceive | 🟢❗ > 🔗 ERC20.transfer | 💥 > 🔗 ERC20._transfer | 🟢🔴 > 🔗 ERC20._beforeTokenTransfer |
🔗 EtherSenderReceiver._ccipReceive | 🟢❗ > 🔗 IERC20.transfer | 💥
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 CCIPReceiver.getRouter | 💥🟢🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 ERC20.approve | 💥 > 🔗 Context._msgSender | 🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 ERC20.approve | 💥 > 🔗 ERC20._approve | 🔴
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 ERC20.approve | 💥 > 🔗 FactoryBurnMintERC20._approve | ['validAddress(address)'] > 🔗 ERC20._approve | 🔴
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 ERC20.approve | 💥 > 🔗 FactoryBurnMintERC20._approve | ['validAddress(address)'] > 🔗 FactoryBurnMintERC20.validAddress | 🌈
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 EtherSenderReceiver._validateFeeToken | 🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 EtherSenderReceiver._validatedMessage | 🟢🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 IERC20.approve | 💥
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 IRouterClient.ccipSend | 💥💲
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 IRouterClient.getFee | 💥🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 IWrappedNative.deposit | 💥💲
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 IEVM2AnyOnRampClient.forwardFromRouter | 💥
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 IEVM2AnyOnRampClient.getFee | 💥🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 IEVM2AnyOnRampClient.getPoolBySourceToken | 💥🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 IWrappedNative.deposit | 💥💲
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 FeeQuoter.processMessageArgs | 🎯💥🟢🟩 > 🔗 Client._argsToBytes | 🎯🟢🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 FeeQuoter.processMessageArgs | 🎯💥🟢🟩 > 🔗 FeeQuoter._parseUnvalidatedEVMExtraArgsFromBytes | 🎯🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 FeeQuoter.processMessageArgs | 🎯💥🟢🟩 > 🔗 FeeQuoter._processPoolReturnData | 🎯🟢🟩 > 🔗 FeeQuoter._validateDestFamilyAddress | 🎯🟩 > 🔗 Internal._validateEVMAddress | 🎯🟢🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 FeeQuoter.processMessageArgs | 🎯💥🟢🟩 > 🔗 FeeQuoter.convertTokenAmount | 🎯💥🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 IFeeQuoter.processMessageArgs | 🎯💥🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 IMessageInterceptor.onOutboundMessage | 🎯💥
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 INonceManager.getIncrementedOutboundNonce | 🎯💥
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 Internal._hash | 🎯🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 AuthorizedCallers.onlyAuthorizedCallers | 🌈 > 🔗 AuthorizedCallers._validateCaller | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 EnumerableMapAddresses.contains | 🟩 > 🔗 EnumerableMapBytes32.contains | 🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 MultiAggregateRateLimiter._getTokenBucket | 🎯🟢🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 MultiAggregateRateLimiter._getTokenValue | 🎯🟢🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 MultiAggregateRateLimiter._getTokenValue | 🎯🟢🟩 > 🔗 IPriceRegistry.getTokenPrice | 💥🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 MultiAggregateRateLimiter._getTokenValue | 🎯🟢🟩 > 🔗 USDPriceWith18Decimals._calcUSDValueFromTokenAmount | 🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 RateLimiter._consume | > 🔗 RateLimiter._calculateRefill | 🟩 > 🔗 RateLimiter._min | 🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 NonceManager.getIncrementedOutboundNonce | 🎯💥🔴❌ ['onlyAuthorizedCallers'] > 🔗 AuthorizedCallers.onlyAuthorizedCallers | 🌈 > 🔗 AuthorizedCallers._validateCaller | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 NonceManager.getIncrementedOutboundNonce | 🎯💥🔴❌ ['onlyAuthorizedCallers'] > 🔗 NonceManager._getOutboundNonce | 🎯🟢🟩 > 🔗 IEVM2AnyOnRamp.getSenderNonce | 💥🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burnFrom | 💥 > 🔗 Context._msgSender | 🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burnFrom | 💥 > 🔗 ERC20._burn | 🟢🔴
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burnFrom | 💥 > 🔗 ERC20._spendAllowance |
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burnFrom | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burnFrom | 💥
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burnFrom | 💥❌ ['onlyBurner'] > 🔗 FactoryBurnMintERC20.onlyBurner | 🌈
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 IBurnMintERC20.burnFrom | 💥
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burn | 💥
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burn | 💥 > 🔗 Context._msgSender | 🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burn | 💥 > 🔗 ERC20._burn | 🟢🔴
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burn | 💥
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner'] > 🔗 FactoryBurnMintERC20.onlyBurner | 🌈
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 IBurnMintERC20.burn | 💥
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPoolAbstract._burn |
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnWithFromMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥 > 🔗 FactoryBurnMintERC20.burnFrom | 💥❌ ['onlyBurner']
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnWithFromMintTokenPool._burn | 🟢 > 🔗 IBurnMintERC20.burn | 💥
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢 > 🔗 RateLimiter._consume |
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 IRouter.getOnRamp | 💥🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 Router.getOnRamp | 💥🟢🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 TokenPool.isSupportedChain | 💥🟢🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool.isSupportedToken | 💥🟢🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool.getRemoteToken | 💥🟢🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burn | 💥 > 🔗 Context._msgSender | 🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burn | 💥 > 🔗 ERC20._burn | 🟢🔴
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burn | 💥
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner'] > 🔗 FactoryBurnMintERC20.onlyBurner | 🌈
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 IBurnMintERC20.burn | 💥
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢 > 🔗 RateLimiter._consume |
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 IRouter.getOnRamp | 💥🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 Router.getOnRamp | 💥🟢🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 TokenPool.isSupportedChain | 💥🟢🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool.isSupportedToken | 💥🟢🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool.getRemoteToken | 💥🟢🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 CCIPHome.supportsInterface | 🎯💥🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 CCIPReceiver.supportsInterface | 💥🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 FactoryBurnMintERC20.supportsInterface | 💥🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool.isSupportedToken | 💥🟢🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool.getRemoteToken | 💥🟢🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool.shouldUseLockRelease | 💥🟢🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 ITokenMessenger.depositForBurnWithCaller | 💥
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool.isSupportedToken | 💥🟢🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool.getRemoteToken | 💥🟢🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 IERC165.supportsInterface | 💥🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 IERC165.supportsInterface | 💥🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 IPoolV1.lockOrBurn | 💥
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢 > 🔗 RateLimiter._consume |
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 IRouter.getOnRamp | 💥🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 Router.getOnRamp | 💥🟢🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 TokenPool.isSupportedChain | 💥🟢🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool.isSupportedToken | 💥🟢🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool.getRemoteToken | 💥🟢🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.supportsInterface | 💥🟩 > 🔗 TokenPool.supportsInterface | 💥🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 OnRamp.getPoolBySourceToken | 🎯💥🟢🟩 > 🔗 ITokenAdminRegistry.getPool | 💥🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 OnRamp.getPoolBySourceToken | 🎯💥🟢🟩 > 🔗 TokenAdminRegistry.getPool | 💥🟢🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 TokenPool.supportsInterface | 💥🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 ITokenMessenger.depositForBurnWithCaller | 💥
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢 > 🔗 RateLimiter._consume |
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 IRouter.getOnRamp | 💥🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 Router.getOnRamp | 💥🟢🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 TokenPool.isSupportedChain | 💥🟢🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool.isSupportedToken | 💥🟢🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool.getRemoteToken | 💥🟢🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getDataAvailabilityCost | 🎯🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenTransferCost | 🎯🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenTransferCost | 🎯🟢🟩 > 🔗 USDPriceWith18Decimals._calcUSDValueFromTokenAmount | 🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getValidatedGasPrice | 🎯🟢🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 AggregatorV3Interface.decimals | 💥🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 AggregatorV3Interface.latestRoundData | 💥🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 FeeQuoter._calculateRebasedValue | 🎯🟢🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._parseEVMExtraArgsFromBytes | 🎯🟩 > 🔗 FeeQuoter._parseUnvalidatedEVMExtraArgsFromBytes | 🎯🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._validateMessage | 🎯🟩 > 🔗 FeeQuoter._validateDestFamilyAddress | 🎯🟩 > 🔗 Internal._validateEVMAddress | 🎯🟢🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 IFeeQuoter.getValidatedFee | 🎯💥🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 IRMNRemote.isCursed | 🎯💥🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 RMNRemote.isCursed | 🎯💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 RMNRemote.isCursed | 🎯💥🟢🟩 > 🔗 EnumerableSet.length | 🟩 > 🔗 EnumerableSet._length | 🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getPoolBySourceToken | 🎯💥🟢🟩 > 🔗 ITokenAdminRegistry.getPool | 💥🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getPoolBySourceToken | 🎯💥🟢🟩 > 🔗 TokenAdminRegistry.getPool | 💥🟢🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 Router.whenNotCursed | 🌈🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 SafeERC20.safeTransfer | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address._revert | 🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 SafeERC20.safeTransfer | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address.isContract | 🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 SafeERC20.safeTransferFrom | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address._revert | 🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 SafeERC20.safeTransferFrom | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address.isContract | 🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.getFee | 💥🟢🟩 > 🔗 IEVM2AnyOnRampClient.getFee | 💥🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.getFee | 💥🟢🟩 > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.getFee | 💥🟢🟩 > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getDataAvailabilityCost | 🎯🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.getFee | 💥🟢🟩 > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenTransferCost | 🎯🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.getFee | 💥🟢🟩 > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenTransferCost | 🎯🟢🟩 > 🔗 USDPriceWith18Decimals._calcUSDValueFromTokenAmount | 🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.getFee | 💥🟢🟩 > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getValidatedGasPrice | 🎯🟢🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.getFee | 💥🟢🟩 > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 AggregatorV3Interface.decimals | 💥🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.getFee | 💥🟢🟩 > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 AggregatorV3Interface.latestRoundData | 💥🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.getFee | 💥🟢🟩 > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 FeeQuoter._calculateRebasedValue | 🎯🟢🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.getFee | 💥🟢🟩 > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._parseEVMExtraArgsFromBytes | 🎯🟩 > 🔗 FeeQuoter._parseUnvalidatedEVMExtraArgsFromBytes | 🎯🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.getFee | 💥🟢🟩 > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._validateMessage | 🎯🟩 > 🔗 FeeQuoter._validateDestFamilyAddress | 🎯🟩 > 🔗 Internal._validateEVMAddress | 🎯🟢🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.getFee | 💥🟢🟩 > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 IFeeQuoter.getValidatedFee | 🎯💥🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.getFee | 💥🟢🟩 > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 IRMNRemote.isCursed | 🎯💥🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.getFee | 💥🟢🟩 > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 RMNRemote.isCursed | 🎯💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 Router.getFee | 💥🟢🟩 > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 RMNRemote.isCursed | 🎯💥🟢🟩 > 🔗 EnumerableSet.length | 🟩 > 🔗 EnumerableSet._length | 🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 SafeERC20.safeTransferFrom | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address._revert | 🟩
🔗 EtherSenderReceiver.ccipSend | 💥🟢💲 > 🔗 SafeERC20.safeTransferFrom | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address.isContract | 🟩
🔗 EtherSenderReceiver.constructor | 💥🟢🔴 > 🔗 CCIPReceiver.constructor | 🔴
🔗 EtherSenderReceiver.constructor | 💥🟢🔴 > 🔗 ERC20.approve | 💥
🔗 EtherSenderReceiver.constructor | 💥🟢🔴 > 🔗 ERC20.approve | 💥 > 🔗 Context._msgSender | 🟩
🔗 EtherSenderReceiver.constructor | 💥🟢🔴 > 🔗 ERC20.approve | 💥 > 🔗 ERC20._approve | 🔴
🔗 EtherSenderReceiver.constructor | 💥🟢🔴 > 🔗 ERC20.approve | 💥 > 🔗 FactoryBurnMintERC20._approve | ['validAddress(address)'] > 🔗 ERC20._approve | 🔴
🔗 EtherSenderReceiver.constructor | 💥🟢🔴 > 🔗 ERC20.approve | 💥 > 🔗 FactoryBurnMintERC20._approve | ['validAddress(address)'] > 🔗 FactoryBurnMintERC20.validAddress | 🌈
🔗 EtherSenderReceiver.constructor | 💥🟢🔴 > 🔗 ICCIPRouter.getWrappedNative | 💥🟩
🔗 EtherSenderReceiver.constructor | 💥🟢🔴 > 🔗 IERC20.approve | 💥
🔗 EtherSenderReceiver.getFee | 💥🟩 > 🔗 CCIPReceiver.getRouter | 💥🟢🟩
🔗 EtherSenderReceiver.getFee | 💥🟩 > 🔗 EtherSenderReceiver._validatedMessage | 🟢🟩
🔗 EtherSenderReceiver.getFee | 💥🟩 > 🔗 IRouterClient.getFee | 💥🟩
🔗 EtherSenderReceiver.getFee | 💥🟩 > 🔗 Router.getFee | 💥🟢🟩 > 🔗 IEVM2AnyOnRampClient.getFee | 💥🟩
🔗 EtherSenderReceiver.getFee | 💥🟩 > 🔗 Router.getFee | 💥🟢🟩 > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 EtherSenderReceiver.getFee | 💥🟩 > 🔗 Router.getFee | 💥🟢🟩 > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getDataAvailabilityCost | 🎯🟩
🔗 EtherSenderReceiver.getFee | 💥🟩 > 🔗 Router.getFee | 💥🟢🟩 > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenTransferCost | 🎯🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩
🔗 EtherSenderReceiver.getFee | 💥🟩 > 🔗 Router.getFee | 💥🟢🟩 > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenTransferCost | 🎯🟢🟩 > 🔗 USDPriceWith18Decimals._calcUSDValueFromTokenAmount | 🟩
🔗 EtherSenderReceiver.getFee | 💥🟩 > 🔗 Router.getFee | 💥🟢🟩 > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getValidatedGasPrice | 🎯🟢🟩
🔗 EtherSenderReceiver.getFee | 💥🟩 > 🔗 Router.getFee | 💥🟢🟩 > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 AggregatorV3Interface.decimals | 💥🟩
🔗 EtherSenderReceiver.getFee | 💥🟩 > 🔗 Router.getFee | 💥🟢🟩 > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 AggregatorV3Interface.latestRoundData | 💥🟩
🔗 EtherSenderReceiver.getFee | 💥🟩 > 🔗 Router.getFee | 💥🟢🟩 > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 FeeQuoter._calculateRebasedValue | 🎯🟢🟩
🔗 EtherSenderReceiver.getFee | 💥🟩 > 🔗 Router.getFee | 💥🟢🟩 > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._parseEVMExtraArgsFromBytes | 🎯🟩 > 🔗 FeeQuoter._parseUnvalidatedEVMExtraArgsFromBytes | 🎯🟩
🔗 EtherSenderReceiver.getFee | 💥🟩 > 🔗 Router.getFee | 💥🟢🟩 > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._validateMessage | 🎯🟩 > 🔗 FeeQuoter._validateDestFamilyAddress | 🎯🟩 > 🔗 Internal._validateEVMAddress | 🎯🟢🟩
🔗 EtherSenderReceiver.getFee | 💥🟩 > 🔗 Router.getFee | 💥🟢🟩 > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 IFeeQuoter.getValidatedFee | 🎯💥🟩
🔗 EtherSenderReceiver.getFee | 💥🟩 > 🔗 Router.getFee | 💥🟢🟩 > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 IRMNRemote.isCursed | 🎯💥🟩
🔗 EtherSenderReceiver.getFee | 💥🟩 > 🔗 Router.getFee | 💥🟢🟩 > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 RMNRemote.isCursed | 🎯💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 EtherSenderReceiver.getFee | 💥🟩 > 🔗 Router.getFee | 💥🟢🟩 > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 RMNRemote.isCursed | 🎯💥🟢🟩 > 🔗 EnumerableSet.length | 🟩 > 🔗 EnumerableSet._length | 🟩
🔗 FactoryBurnMintERC20.constructor | 💥🔴 > 🔗 ERC20._mint | 🟢🔴 > 🔗 ERC20._afterTokenTransfer |
🔗 FactoryBurnMintERC20.constructor | 💥🔴 > 🔗 ERC20._mint | 🟢🔴 > 🔗 ERC20._beforeTokenTransfer |
🔗 FactoryBurnMintERC20.constructor | 💥🔴 > 🔗 ERC20.constructor | 💥🔴
🔗 FactoryBurnMintERC20.constructor | 💥🔴 > 🔗 FactoryBurnMintERC20.grantBurnRole | 💥🟢❌ ['onlyOwner'] > 🔗 EnumerableSet.add | > 🔗 EnumerableSet._add | > 🔗 EnumerableSet._contains | 🟩
🔗 FactoryBurnMintERC20.constructor | 💥🔴 > 🔗 FactoryBurnMintERC20.grantBurnRole | 💥🟢❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 FactoryBurnMintERC20.constructor | 💥🔴 > 🔗 FactoryBurnMintERC20.grantMintRole | 💥🟢❌ ['onlyOwner'] > 🔗 EnumerableSet.add | > 🔗 EnumerableSet._add | > 🔗 EnumerableSet._contains | 🟩
🔗 FactoryBurnMintERC20.constructor | 💥🔴 > 🔗 FactoryBurnMintERC20.grantMintRole | 💥🟢❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 FactoryBurnMintERC20.decreaseApproval | 💥 > 🔗 ERC20.decreaseAllowance | 💥 > 🔗 Context._msgSender | 🟩
🔗 FactoryBurnMintERC20.decreaseApproval | 💥 > 🔗 ERC20.decreaseAllowance | 💥 > 🔗 ERC20.allowance | 💥🟢🟩
🔗 FactoryBurnMintERC20.decreaseApproval | 💥 > 🔗 ERC20.decreaseAllowance | 💥 > 🔗 FactoryBurnMintERC20._approve | ['validAddress(address)'] > 🔗 ERC20._approve | 🔴
🔗 FactoryBurnMintERC20.decreaseApproval | 💥 > 🔗 ERC20.decreaseAllowance | 💥 > 🔗 FactoryBurnMintERC20._approve | ['validAddress(address)'] > 🔗 FactoryBurnMintERC20.validAddress | 🌈
🔗 FactoryBurnMintERC20.getBurners | 💥🟢🟩 > 🔗 EnumerableSet.values | 🟩 > 🔗 EnumerableSet._values | 🟩
🔗 FactoryBurnMintERC20.getMinters | 💥🟢🟩 > 🔗 EnumerableSet.values | 🟩 > 🔗 EnumerableSet._values | 🟩
🔗 FactoryBurnMintERC20.increaseApproval | 💥 > 🔗 ERC20.increaseAllowance | 💥 > 🔗 Context._msgSender | 🟩
🔗 FactoryBurnMintERC20.increaseApproval | 💥 > 🔗 ERC20.increaseAllowance | 💥 > 🔗 ERC20.allowance | 💥🟢🟩
🔗 FactoryBurnMintERC20.increaseApproval | 💥 > 🔗 ERC20.increaseAllowance | 💥 > 🔗 FactoryBurnMintERC20._approve | ['validAddress(address)'] > 🔗 ERC20._approve | 🔴
🔗 FactoryBurnMintERC20.increaseApproval | 💥 > 🔗 ERC20.increaseAllowance | 💥 > 🔗 FactoryBurnMintERC20._approve | ['validAddress(address)'] > 🔗 FactoryBurnMintERC20.validAddress | 🌈
🔗 FactoryBurnMintERC20.revokeBurnRole | 💥🟢❌ ['onlyOwner'] > 🔗 EnumerableSet.remove | > 🔗 EnumerableSet._remove |
🔗 FactoryBurnMintERC20.revokeBurnRole | 💥🟢❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 FactoryBurnMintERC20.revokeMintRole | 💥🟢❌ ['onlyOwner'] > 🔗 EnumerableSet.remove | > 🔗 EnumerableSet._remove |
🔗 FactoryBurnMintERC20.revokeMintRole | 💥🟢❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 FactoryBurnMintERC20.setCCIPAdmin | 💥🟢🔴❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 FeeQuoter.applyDestChainConfigUpdates | 🎯💥❌ ['onlyOwner'] > 🔗 FeeQuoter._applyDestChainConfigUpdates | 🎯🟢🔴
🔗 FeeQuoter.applyDestChainConfigUpdates | 🎯💥❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 FeeQuoter.applyFeeTokensUpdates | 🎯💥❌ ['onlyOwner'] > 🔗 FeeQuoter._applyFeeTokensUpdates | 🎯🟢 > 🔗 EnumerableSet.add | > 🔗 EnumerableSet._add | > 🔗 EnumerableSet._contains | 🟩
🔗 FeeQuoter.applyFeeTokensUpdates | 🎯💥❌ ['onlyOwner'] > 🔗 FeeQuoter._applyFeeTokensUpdates | 🎯🟢 > 🔗 EnumerableSet.remove | > 🔗 EnumerableSet._remove |
🔗 FeeQuoter.applyFeeTokensUpdates | 🎯💥❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 FeeQuoter.applyPremiumMultiplierWeiPerEthUpdates | 🎯💥❌ ['onlyOwner'] > 🔗 FeeQuoter._applyPremiumMultiplierWeiPerEthUpdates | 🎯🔴
🔗 FeeQuoter.applyPremiumMultiplierWeiPerEthUpdates | 🎯💥❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 FeeQuoter.applyTokenTransferFeeConfigUpdates | 🎯💥❌ ['onlyOwner'] > 🔗 FeeQuoter._applyTokenTransferFeeConfigUpdates | 🎯🟢🔴
🔗 FeeQuoter.applyTokenTransferFeeConfigUpdates | 🎯💥❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 FeeQuoter.constructor | 🎯💥🔴 > 🔗 AuthorizedCallers.constructor | 💥 > 🔗 AuthorizedCallers._applyAuthorizedCallerUpdates | 🟢 > 🔗 EnumerableSet.add | > 🔗 EnumerableSet._add | > 🔗 EnumerableSet._contains | 🟩
🔗 FeeQuoter.constructor | 🎯💥🔴 > 🔗 AuthorizedCallers.constructor | 💥 > 🔗 AuthorizedCallers._applyAuthorizedCallerUpdates | 🟢 > 🔗 EnumerableSet.remove | > 🔗 EnumerableSet._remove |
🔗 FeeQuoter.constructor | 🎯💥🔴 > 🔗 FeeQuoter._applyDestChainConfigUpdates | 🎯🟢🔴
🔗 FeeQuoter.constructor | 🎯💥🔴 > 🔗 FeeQuoter._applyFeeTokensUpdates | 🎯🟢 > 🔗 EnumerableSet.add | > 🔗 EnumerableSet._add | > 🔗 EnumerableSet._contains | 🟩
🔗 FeeQuoter.constructor | 🎯💥🔴 > 🔗 FeeQuoter._applyFeeTokensUpdates | 🎯🟢 > 🔗 EnumerableSet.remove | > 🔗 EnumerableSet._remove |
🔗 FeeQuoter.constructor | 🎯💥🔴 > 🔗 FeeQuoter._applyPremiumMultiplierWeiPerEthUpdates | 🎯🔴
🔗 FeeQuoter.constructor | 🎯💥🔴 > 🔗 FeeQuoter._applyTokenTransferFeeConfigUpdates | 🎯🟢🔴
🔗 FeeQuoter.constructor | 🎯💥🔴 > 🔗 FeeQuoter._updateTokenPriceFeeds | 🎯🔴
🔗 FeeQuoter.getFeeTokens | 🎯💥🟢🟩 > 🔗 EnumerableSet.values | 🟩 > 🔗 EnumerableSet._values | 🟩
🔗 FeeQuoter.getTokenAndGasPrices | 🎯💥🟢🟩 > 🔗 FeeQuoter._getValidatedGasPrice | 🎯🟢🟩
🔗 FeeQuoter.getTokenAndGasPrices | 🎯💥🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 AggregatorV3Interface.decimals | 💥🟩
🔗 FeeQuoter.getTokenAndGasPrices | 🎯💥🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 AggregatorV3Interface.latestRoundData | 💥🟩
🔗 FeeQuoter.getTokenAndGasPrices | 🎯💥🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 FeeQuoter._calculateRebasedValue | 🎯🟢🟩
🔗 FeeQuoter.getTokenPrices | 🎯💥🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 AggregatorV3Interface.decimals | 💥🟩
🔗 FeeQuoter.getTokenPrices | 🎯💥🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 AggregatorV3Interface.latestRoundData | 💥🟩
🔗 FeeQuoter.getTokenPrices | 🎯💥🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 FeeQuoter._calculateRebasedValue | 🎯🟢🟩
🔗 FeeQuoter.getValidatedTokenPrice | 🎯💥🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 AggregatorV3Interface.decimals | 💥🟩
🔗 FeeQuoter.getValidatedTokenPrice | 🎯💥🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 AggregatorV3Interface.latestRoundData | 💥🟩
🔗 FeeQuoter.getValidatedTokenPrice | 🎯💥🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 FeeQuoter._calculateRebasedValue | 🎯🟢🟩
🔗 FeeQuoter.onReport | 🎯💥🟢🔴 > 🔗 FeeQuoter._calculateRebasedValue | 🎯🟢🟩
🔗 FeeQuoter.onReport | 🎯💥🟢🔴 > 🔗 KeystoneFeedDefaultMetadataLib._extractMetadataInfo | 🟩
🔗 FeeQuoter.onReport | 🎯💥🟢🔴 > 🔗 KeystoneFeedsPermissionHandler._validateReportPermission | 🟢🟩 > 🔗 KeystoneFeedsPermissionHandler._createReportId | 🟩
🔗 FeeQuoter.updateTokenPriceFeeds | 🎯💥❌ ['onlyOwner'] > 🔗 FeeQuoter._updateTokenPriceFeeds | 🎯🔴
🔗 FeeQuoter.updateTokenPriceFeeds | 🎯💥❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 HybridLockReleaseUSDCTokenPool.constructor | 💥 > 🔗 USDCBridgeMigrator.constructor | 🔴
🔗 HybridLockReleaseUSDCTokenPool.constructor | 💥 > 🔗 USDCTokenPool.constructor | 💥🟢🔴 > 🔗 IMessageTransmitter.localDomain | 💥🟩
🔗 HybridLockReleaseUSDCTokenPool.constructor | 💥 > 🔗 USDCTokenPool.constructor | 💥🟢🔴 > 🔗 IMessageTransmitter.version | 💥🟩
🔗 HybridLockReleaseUSDCTokenPool.constructor | 💥 > 🔗 USDCTokenPool.constructor | 💥🟢🔴 > 🔗 ITokenMessenger.localMessageTransmitter | 💥🟩
🔗 HybridLockReleaseUSDCTokenPool.constructor | 💥 > 🔗 USDCTokenPool.constructor | 💥🟢🔴 > 🔗 ITokenMessenger.messageBodyVersion | 💥🟩
🔗 HybridLockReleaseUSDCTokenPool.constructor | 💥 > 🔗 USDCTokenPool.constructor | 💥🟢🔴 > 🔗 SafeERC20.safeIncreaseAllowance | > 🔗 ERC20.allowance | 💥🟢🟩
🔗 HybridLockReleaseUSDCTokenPool.constructor | 💥 > 🔗 USDCTokenPool.constructor | 💥🟢🔴 > 🔗 SafeERC20.safeIncreaseAllowance | > 🔗 IERC20.allowance | 💥🟩
🔗 HybridLockReleaseUSDCTokenPool.constructor | 💥 > 🔗 USDCTokenPool.constructor | 💥🟢🔴 > 🔗 SafeERC20.safeIncreaseAllowance | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address._revert | 🟩
🔗 HybridLockReleaseUSDCTokenPool.constructor | 💥 > 🔗 USDCTokenPool.constructor | 💥🟢🔴 > 🔗 SafeERC20.safeIncreaseAllowance | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address.isContract | 🟩
🔗 HybridLockReleaseUSDCTokenPool.constructor | 💥 > 🔗 USDCTokenPool.constructor | 💥🟢🔴 > 🔗 TokenPool.constructor | 🟢🔴 > 🔗 TokenPool._applyAllowListUpdates | 🟢 > 🔗 EnumerableSet.add | > 🔗 EnumerableSet._add | > 🔗 EnumerableSet._contains | 🟩
🔗 HybridLockReleaseUSDCTokenPool.constructor | 💥 > 🔗 USDCTokenPool.constructor | 💥🟢🔴 > 🔗 TokenPool.constructor | 🟢🔴 > 🔗 TokenPool._applyAllowListUpdates | 🟢 > 🔗 EnumerableSet.remove | > 🔗 EnumerableSet._remove |
🔗 HybridLockReleaseUSDCTokenPool.provideLiquidity | 💥🟢🔴 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 HybridLockReleaseUSDCTokenPool.provideLiquidity | 💥🟢🔴 > 🔗 SafeERC20.safeTransferFrom | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address._revert | 🟩
🔗 HybridLockReleaseUSDCTokenPool.provideLiquidity | 💥🟢🔴 > 🔗 SafeERC20.safeTransferFrom | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address.isContract | 🟩
🔗 HybridLockReleaseUSDCTokenPool.releaseOrMint | 💥 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseIncomingMessage | 🟢🔴 > 🔗 SafeERC20.safeTransfer | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address._revert | 🟩
🔗 HybridLockReleaseUSDCTokenPool.releaseOrMint | 💥 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseIncomingMessage | 🟢🔴 > 🔗 SafeERC20.safeTransfer | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address.isContract | 🟩
🔗 HybridLockReleaseUSDCTokenPool.releaseOrMint | 💥 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseIncomingMessage | 🟢🔴 > 🔗 TokenPool._validateReleaseOrMint | 🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 HybridLockReleaseUSDCTokenPool.releaseOrMint | 💥 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseIncomingMessage | 🟢🔴 > 🔗 TokenPool._validateReleaseOrMint | 🟢 > 🔗 TokenPool._consumeInboundRateLimit | 🟢 > 🔗 RateLimiter._consume | > 🔗 RateLimiter._calculateRefill | 🟩 > 🔗 RateLimiter._min | 🟩
🔗 HybridLockReleaseUSDCTokenPool.releaseOrMint | 💥 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseIncomingMessage | 🟢🔴 > 🔗 TokenPool._validateReleaseOrMint | 🟢 > 🔗 TokenPool._onlyOffRamp | 🟢🟩 > 🔗 IRouter.isOffRamp | 💥🟩
🔗 HybridLockReleaseUSDCTokenPool.releaseOrMint | 💥 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseIncomingMessage | 🟢🔴 > 🔗 TokenPool._validateReleaseOrMint | 🟢 > 🔗 TokenPool._onlyOffRamp | 🟢🟩 > 🔗 Router.isOffRamp | 💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 HybridLockReleaseUSDCTokenPool.releaseOrMint | 💥 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseIncomingMessage | 🟢🔴 > 🔗 TokenPool._validateReleaseOrMint | 🟢 > 🔗 TokenPool._onlyOffRamp | 🟢🟩 > 🔗 Router.isOffRamp | 💥🟢🟩 > 🔗 Router._mergeChainSelectorAndOffRamp | 🟩
🔗 HybridLockReleaseUSDCTokenPool.releaseOrMint | 💥 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseIncomingMessage | 🟢🔴 > 🔗 TokenPool._validateReleaseOrMint | 🟢 > 🔗 TokenPool._onlyOffRamp | 🟢🟩 > 🔗 TokenPool.isSupportedChain | 💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 HybridLockReleaseUSDCTokenPool.releaseOrMint | 💥 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseIncomingMessage | 🟢🔴 > 🔗 TokenPool._validateReleaseOrMint | 🟢 > 🔗 TokenPool.getRemotePool | 💥🟢🟩
🔗 HybridLockReleaseUSDCTokenPool.releaseOrMint | 💥 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseIncomingMessage | 🟢🔴 > 🔗 TokenPool._validateReleaseOrMint | 🟢 > 🔗 TokenPool.isSupportedToken | 💥🟢🟩
🔗 HybridLockReleaseUSDCTokenPool.releaseOrMint | 💥 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseIncomingMessage | 🟢🔴 > 🔗 TokenPool.getToken | 💥🟢🟩
🔗 HybridLockReleaseUSDCTokenPool.releaseOrMint | 💥 > 🔗 USDCTokenPool.releaseOrMint | 💥🟢 > 🔗 IMessageTransmitter.receiveMessage | 💥
🔗 HybridLockReleaseUSDCTokenPool.releaseOrMint | 💥 > 🔗 USDCTokenPool.releaseOrMint | 💥🟢 > 🔗 TokenPool._validateReleaseOrMint | 🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 HybridLockReleaseUSDCTokenPool.releaseOrMint | 💥 > 🔗 USDCTokenPool.releaseOrMint | 💥🟢 > 🔗 TokenPool._validateReleaseOrMint | 🟢 > 🔗 TokenPool._consumeInboundRateLimit | 🟢 > 🔗 RateLimiter._consume | > 🔗 RateLimiter._calculateRefill | 🟩 > 🔗 RateLimiter._min | 🟩
🔗 HybridLockReleaseUSDCTokenPool.releaseOrMint | 💥 > 🔗 USDCTokenPool.releaseOrMint | 💥🟢 > 🔗 TokenPool._validateReleaseOrMint | 🟢 > 🔗 TokenPool._onlyOffRamp | 🟢🟩 > 🔗 IRouter.isOffRamp | 💥🟩
🔗 HybridLockReleaseUSDCTokenPool.releaseOrMint | 💥 > 🔗 USDCTokenPool.releaseOrMint | 💥🟢 > 🔗 TokenPool._validateReleaseOrMint | 🟢 > 🔗 TokenPool._onlyOffRamp | 🟢🟩 > 🔗 Router.isOffRamp | 💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 HybridLockReleaseUSDCTokenPool.releaseOrMint | 💥 > 🔗 USDCTokenPool.releaseOrMint | 💥🟢 > 🔗 TokenPool._validateReleaseOrMint | 🟢 > 🔗 TokenPool._onlyOffRamp | 🟢🟩 > 🔗 Router.isOffRamp | 💥🟢🟩 > 🔗 Router._mergeChainSelectorAndOffRamp | 🟩
🔗 HybridLockReleaseUSDCTokenPool.releaseOrMint | 💥 > 🔗 USDCTokenPool.releaseOrMint | 💥🟢 > 🔗 TokenPool._validateReleaseOrMint | 🟢 > 🔗 TokenPool._onlyOffRamp | 🟢🟩 > 🔗 TokenPool.isSupportedChain | 💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 HybridLockReleaseUSDCTokenPool.releaseOrMint | 💥 > 🔗 USDCTokenPool.releaseOrMint | 💥🟢 > 🔗 TokenPool._validateReleaseOrMint | 🟢 > 🔗 TokenPool.getRemotePool | 💥🟢🟩
🔗 HybridLockReleaseUSDCTokenPool.releaseOrMint | 💥 > 🔗 USDCTokenPool.releaseOrMint | 💥🟢 > 🔗 TokenPool._validateReleaseOrMint | 🟢 > 🔗 TokenPool.isSupportedToken | 💥🟢🟩
🔗 HybridLockReleaseUSDCTokenPool.releaseOrMint | 💥 > 🔗 USDCTokenPool.releaseOrMint | 💥🟢 > 🔗 USDCTokenPool._validateMessage | 🟢🟩
🔗 HybridLockReleaseUSDCTokenPool.setLiquidityProvider | 💥🟢🔴❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 HybridLockReleaseUSDCTokenPool.transferLiquidity | 💥🟢🔴❌ ['onlyOwner'] > 🔗 HybridLockReleaseUSDCTokenPool.withdrawLiquidity | 💥🟢🔴❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 HybridLockReleaseUSDCTokenPool.transferLiquidity | 💥🟢🔴❌ ['onlyOwner'] > 🔗 HybridLockReleaseUSDCTokenPool.withdrawLiquidity | 💥🟢🔴❌ ['onlyOwner'] > 🔗 SafeERC20.safeTransfer | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address._revert | 🟩
🔗 HybridLockReleaseUSDCTokenPool.transferLiquidity | 💥🟢🔴❌ ['onlyOwner'] > 🔗 HybridLockReleaseUSDCTokenPool.withdrawLiquidity | 💥🟢🔴❌ ['onlyOwner'] > 🔗 SafeERC20.safeTransfer | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address.isContract | 🟩
🔗 HybridLockReleaseUSDCTokenPool.transferLiquidity | 💥🟢🔴❌ ['onlyOwner'] > 🔗 Ownable2Step.acceptOwnership | 💥🟢🔴
🔗 HybridLockReleaseUSDCTokenPool.transferLiquidity | 💥🟢🔴❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 HybridLockReleaseUSDCTokenPool.transferLiquidity | 💥🟢🔴❌ ['onlyOwner'] > 🔗 USDCBridgeMigrator.getLockedTokensForChain | 💥🟢🟩
🔗 HybridLockReleaseUSDCTokenPool.updateChainSelectorMechanisms | 💥🟢🔴❌ ['onlyOwner'] > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 HybridLockReleaseUSDCTokenPool.updateChainSelectorMechanisms | 💥🟢🔴❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 KeystoneFeedsPermissionHandler.setReportPermissions | 💥❌ ['onlyOwner'] > 🔗 KeystoneFeedsPermissionHandler._setReportPermission | 🔴 > 🔗 KeystoneFeedsPermissionHandler._createReportId | 🟩
🔗 KeystoneFeedsPermissionHandler.setReportPermissions | 💥❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 LockReleaseTokenPool.constructor | 💥🔴 > 🔗 TokenPool.constructor | 🟢🔴 > 🔗 TokenPool._applyAllowListUpdates | 🟢 > 🔗 EnumerableSet.add | > 🔗 EnumerableSet._add | > 🔗 EnumerableSet._contains | 🟩
🔗 LockReleaseTokenPool.constructor | 💥🔴 > 🔗 TokenPool.constructor | 🟢🔴 > 🔗 TokenPool._applyAllowListUpdates | 🟢 > 🔗 EnumerableSet.remove | > 🔗 EnumerableSet._remove |
🔗 LockReleaseTokenPool.provideLiquidity | 💥🟢 > 🔗 SafeERC20.safeTransferFrom | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address._revert | 🟩
🔗 LockReleaseTokenPool.provideLiquidity | 💥🟢 > 🔗 SafeERC20.safeTransferFrom | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address.isContract | 🟩
🔗 LockReleaseTokenPool.releaseOrMint | 💥 > 🔗 SafeERC20.safeTransfer | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address._revert | 🟩
🔗 LockReleaseTokenPool.releaseOrMint | 💥 > 🔗 SafeERC20.safeTransfer | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address.isContract | 🟩
🔗 LockReleaseTokenPool.releaseOrMint | 💥 > 🔗 TokenPool._validateReleaseOrMint | 🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 LockReleaseTokenPool.releaseOrMint | 💥 > 🔗 TokenPool._validateReleaseOrMint | 🟢 > 🔗 TokenPool._consumeInboundRateLimit | 🟢 > 🔗 RateLimiter._consume | > 🔗 RateLimiter._calculateRefill | 🟩 > 🔗 RateLimiter._min | 🟩
🔗 LockReleaseTokenPool.releaseOrMint | 💥 > 🔗 TokenPool._validateReleaseOrMint | 🟢 > 🔗 TokenPool._onlyOffRamp | 🟢🟩 > 🔗 IRouter.isOffRamp | 💥🟩
🔗 LockReleaseTokenPool.releaseOrMint | 💥 > 🔗 TokenPool._validateReleaseOrMint | 🟢 > 🔗 TokenPool._onlyOffRamp | 🟢🟩 > 🔗 Router.isOffRamp | 💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 LockReleaseTokenPool.releaseOrMint | 💥 > 🔗 TokenPool._validateReleaseOrMint | 🟢 > 🔗 TokenPool._onlyOffRamp | 🟢🟩 > 🔗 Router.isOffRamp | 💥🟢🟩 > 🔗 Router._mergeChainSelectorAndOffRamp | 🟩
🔗 LockReleaseTokenPool.releaseOrMint | 💥 > 🔗 TokenPool._validateReleaseOrMint | 🟢 > 🔗 TokenPool._onlyOffRamp | 🟢🟩 > 🔗 TokenPool.isSupportedChain | 💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 LockReleaseTokenPool.releaseOrMint | 💥 > 🔗 TokenPool._validateReleaseOrMint | 🟢 > 🔗 TokenPool.getRemotePool | 💥🟢🟩
🔗 LockReleaseTokenPool.releaseOrMint | 💥 > 🔗 TokenPool._validateReleaseOrMint | 🟢 > 🔗 TokenPool.isSupportedToken | 💥🟢🟩
🔗 LockReleaseTokenPool.releaseOrMint | 💥 > 🔗 TokenPool.getToken | 💥🟢🟩
🔗 LockReleaseTokenPool.setRebalancer | 💥🔴❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 LockReleaseTokenPool.transferLiquidity | 💥❌ ['onlyOwner'] > 🔗 ILiquidityContainer.withdrawLiquidity | 💥
🔗 LockReleaseTokenPool.transferLiquidity | 💥❌ ['onlyOwner'] > 🔗 LockReleaseTokenPool.withdrawLiquidity | 💥🟢 > 🔗 ERC20.balanceOf | 💥🟢🟩
🔗 LockReleaseTokenPool.transferLiquidity | 💥❌ ['onlyOwner'] > 🔗 LockReleaseTokenPool.withdrawLiquidity | 💥🟢 > 🔗 IERC20.balanceOf | 💥🟩
🔗 LockReleaseTokenPool.transferLiquidity | 💥❌ ['onlyOwner'] > 🔗 LockReleaseTokenPool.withdrawLiquidity | 💥🟢 > 🔗 SafeERC20.safeTransfer | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address._revert | 🟩
🔗 LockReleaseTokenPool.transferLiquidity | 💥❌ ['onlyOwner'] > 🔗 LockReleaseTokenPool.withdrawLiquidity | 💥🟢 > 🔗 SafeERC20.safeTransfer | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address.isContract | 🟩
🔗 LockReleaseTokenPool.transferLiquidity | 💥❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 LockReleaseTokenPool.withdrawLiquidity | 💥🟢 > 🔗 ERC20.balanceOf | 💥🟢🟩
🔗 LockReleaseTokenPool.withdrawLiquidity | 💥🟢 > 🔗 IERC20.balanceOf | 💥🟩
🔗 MultiAggregateRateLimiter.applyRateLimiterConfigUpdates | 🎯💥🟢🔴❌ ['onlyOwner'] > 🔗 MultiAggregateRateLimiter._getTokenBucket | 🎯🟢🟩
🔗 MultiAggregateRateLimiter.applyRateLimiterConfigUpdates | 🎯💥🟢🔴❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 MultiAggregateRateLimiter.applyRateLimiterConfigUpdates | 🎯💥🟢🔴❌ ['onlyOwner'] > 🔗 RateLimiter._setTokenBucketConfig | > 🔗 RateLimiter._calculateRefill | 🟩 > 🔗 RateLimiter._min | 🟩
🔗 MultiAggregateRateLimiter.applyRateLimiterConfigUpdates | 🎯💥🟢🔴❌ ['onlyOwner'] > 🔗 RateLimiter._setTokenBucketConfig | > 🔗 RateLimiter._min | 🟩
🔗 MultiAggregateRateLimiter.applyRateLimiterConfigUpdates | 🎯💥🟢🔴❌ ['onlyOwner'] > 🔗 RateLimiter._validateTokenBucketConfig | 🟩
🔗 MultiAggregateRateLimiter.constructor | 🎯💥 > 🔗 AuthorizedCallers.constructor | 💥 > 🔗 AuthorizedCallers._applyAuthorizedCallerUpdates | 🟢 > 🔗 EnumerableSet.add | > 🔗 EnumerableSet._add | > 🔗 EnumerableSet._contains | 🟩
🔗 MultiAggregateRateLimiter.constructor | 🎯💥 > 🔗 AuthorizedCallers.constructor | 💥 > 🔗 AuthorizedCallers._applyAuthorizedCallerUpdates | 🟢 > 🔗 EnumerableSet.remove | > 🔗 EnumerableSet._remove |
🔗 MultiAggregateRateLimiter.constructor | 🎯💥 > 🔗 MultiAggregateRateLimiter._setFeeQuoter | 🎯🔴
🔗 MultiAggregateRateLimiter.currentRateLimiterState | 🎯💥🟩 > 🔗 MultiAggregateRateLimiter._getTokenBucket | 🎯🟢🟩
🔗 MultiAggregateRateLimiter.currentRateLimiterState | 🎯💥🟩 > 🔗 RateLimiter._currentTokenBucketState | 🟩 > 🔗 RateLimiter._calculateRefill | 🟩 > 🔗 RateLimiter._min | 🟩
🔗 MultiAggregateRateLimiter.getAllRateLimitTokens | 🎯💥🟢🟩 > 🔗 EnumerableMapAddresses.at | 🟩 > 🔗 EnumerableMapBytes32.at | 🟩 > 🔗 EnumerableSet.at | 🟩 > 🔗 EnumerableSet._at | 🟩
🔗 MultiAggregateRateLimiter.getAllRateLimitTokens | 🎯💥🟢🟩 > 🔗 EnumerableMapAddresses.length | 🟩 > 🔗 EnumerableMapBytes32.length | 🟩 > 🔗 EnumerableSet.length | 🟩 > 🔗 EnumerableSet._length | 🟩
🔗 MultiAggregateRateLimiter.setFeeQuoter | 🎯💥❌ ['onlyOwner'] > 🔗 MultiAggregateRateLimiter._setFeeQuoter | 🎯🔴
🔗 MultiAggregateRateLimiter.setFeeQuoter | 🎯💥❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 MultiAggregateRateLimiter.updateRateLimitTokens | 🎯💥🟢❌ ['onlyOwner'] > 🔗 EnumerableMapAddresses.remove | > 🔗 EnumerableMapBytes32.remove | > 🔗 EnumerableSet.remove | > 🔗 EnumerableSet._remove |
🔗 MultiAggregateRateLimiter.updateRateLimitTokens | 🎯💥🟢❌ ['onlyOwner'] > 🔗 EnumerableMapAddresses.set | > 🔗 EnumerableMapBytes32.set | > 🔗 EnumerableSet.add | > 🔗 EnumerableSet._add | > 🔗 EnumerableSet._contains | 🟩
🔗 MultiAggregateRateLimiter.updateRateLimitTokens | 🎯💥🟢❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 MultiOCR3Base._transmit | 🎯🟢 > 🔗 MultiOCR3Base._verifySignatures | 🎯🟢🟩
🔗 MultiOCR3Base._transmit | 🎯🟢 > 🔗 MultiOCR3Base._whenChainNotForked | 🎯🟢🟩
🔗 MultiOCR3Base.setOCR3Configs | 🎯💥❌ ['onlyOwner'] > 🔗 MultiOCR3Base._setOCR3Config | 🎯🟢🔴 > 🔗 MultiOCR3Base._afterOCR3ConfigSet | 🎯
🔗 MultiOCR3Base.setOCR3Configs | 🎯💥❌ ['onlyOwner'] > 🔗 MultiOCR3Base._setOCR3Config | 🎯🟢🔴 > 🔗 MultiOCR3Base._assignOracleRoles | 🎯🟢🔴
🔗 MultiOCR3Base.setOCR3Configs | 🎯💥❌ ['onlyOwner'] > 🔗 MultiOCR3Base._setOCR3Config | 🎯🟢🔴 > 🔗 MultiOCR3Base._clearOracleRoles | 🎯🟢🔴
🔗 MultiOCR3Base.setOCR3Configs | 🎯💥❌ ['onlyOwner'] > 🔗 MultiOCR3Base._setOCR3Config | 🎯🟢🔴 > 🔗 OffRamp._afterOCR3ConfigSet | 🎯🟢🔴
🔗 MultiOCR3Base.setOCR3Configs | 🎯💥❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 NonceManager.applyPreviousRampsUpdates | 🎯💥🟢🔴❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 NonceManager.constructor | 🎯💥 > 🔗 AuthorizedCallers.constructor | 💥 > 🔗 AuthorizedCallers._applyAuthorizedCallerUpdates | 🟢 > 🔗 EnumerableSet.add | > 🔗 EnumerableSet._add | > 🔗 EnumerableSet._contains | 🟩
🔗 NonceManager.constructor | 🎯💥 > 🔗 AuthorizedCallers.constructor | 💥 > 🔗 AuthorizedCallers._applyAuthorizedCallerUpdates | 🟢 > 🔗 EnumerableSet.remove | > 🔗 EnumerableSet._remove |
🔗 NonceManager.getInboundNonce | 🎯💥🟩 > 🔗 NonceManager._getInboundNonce | 🎯🟢🟩 > 🔗 IEVM2AnyOnRamp.getSenderNonce | 💥🟩
🔗 NonceManager.getOutboundNonce | 🎯💥🟩 > 🔗 NonceManager._getOutboundNonce | 🎯🟢🟩 > 🔗 IEVM2AnyOnRamp.getSenderNonce | 💥🟩
🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 MultiAggregateRateLimiter.onInboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 AuthorizedCallers.onlyAuthorizedCallers | 🌈 > 🔗 AuthorizedCallers._validateCaller | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 MultiAggregateRateLimiter.onInboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 EnumerableMapAddresses.contains | 🟩 > 🔗 EnumerableMapBytes32.contains | 🟩
🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 MultiAggregateRateLimiter.onInboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 MultiAggregateRateLimiter._getTokenValue | 🎯🟢🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩
🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 MultiAggregateRateLimiter.onInboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 MultiAggregateRateLimiter._getTokenValue | 🎯🟢🟩 > 🔗 IPriceRegistry.getTokenPrice | 💥🟩
🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 MultiAggregateRateLimiter.onInboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 MultiAggregateRateLimiter._getTokenValue | 🎯🟢🟩 > 🔗 USDPriceWith18Decimals._calcUSDValueFromTokenAmount | 🟩
🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 MultiAggregateRateLimiter.onInboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 RateLimiter._consume | > 🔗 RateLimiter._calculateRefill | 🟩
🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 OffRamp._releaseOrMintTokens | 🎯 > 🔗 OffRamp._releaseOrMintSingleToken | 🎯🟢 > 🔗 ERC165Checker.supportsInterface | 🟩 > 🔗 ERC165Checker.supportsERC165 | 🟢🟩
🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 OffRamp._releaseOrMintTokens | 🎯 > 🔗 OffRamp._releaseOrMintSingleToken | 🎯🟢 > 🔗 ERC165Checker.supportsInterface | 🟩 > 🔗 ERC165Checker.supportsERC165InterfaceUnchecked | 🟩
🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 OffRamp._releaseOrMintTokens | 🎯 > 🔗 OffRamp._releaseOrMintSingleToken | 🎯🟢 > 🔗 OffRamp._getBalanceOfReceiver | 🎯 > 🔗 CallWithExactGas._callWithExactGasSafeReturnData | 🟢
🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 Router.routeMessage | 💥 ['whenNotCursed'] > 🔗 Router.isOffRamp | 💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 MultiAggregateRateLimiter.onInboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 AuthorizedCallers.onlyAuthorizedCallers | 🌈 > 🔗 AuthorizedCallers._validateCaller | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 MultiAggregateRateLimiter.onInboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 EnumerableMapAddresses.contains | 🟩 > 🔗 EnumerableMapBytes32.contains | 🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 MultiAggregateRateLimiter.onInboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 MultiAggregateRateLimiter._getTokenValue | 🎯🟢🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩
🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 MultiAggregateRateLimiter.onInboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 RateLimiter._consume | > 🔗 RateLimiter._calculateRefill | 🟩 > 🔗 RateLimiter._min | 🟩
🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 OffRamp._releaseOrMintTokens | 🎯 > 🔗 OffRamp._releaseOrMintSingleToken | 🎯🟢 > 🔗 ERC165Checker.supportsInterface | 🟩 > 🔗 ERC165Checker.supportsERC165 | 🟢🟩 > 🔗 ERC165Checker.supportsERC165InterfaceUnchecked | 🟩
🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 MultiAggregateRateLimiter.onInboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 EnumerableMapAddresses.contains | 🟩 > 🔗 EnumerableMapBytes32.contains | 🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 MultiAggregateRateLimiter.onInboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 MultiAggregateRateLimiter._getTokenValue | 🎯🟢🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 AggregatorV3Interface.decimals | 💥🟩
🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 MultiAggregateRateLimiter.onInboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 MultiAggregateRateLimiter._getTokenValue | 🎯🟢🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 AggregatorV3Interface.latestRoundData | 💥🟩
🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 MultiAggregateRateLimiter.onInboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 MultiAggregateRateLimiter._getTokenValue | 🎯🟢🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 FeeQuoter._calculateRebasedValue | 🎯🟢🟩
🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 MultiAggregateRateLimiter.onInboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 MultiAggregateRateLimiter._getTokenValue | 🎯🟢🟩 > 🔗 IPriceRegistry.getTokenPrice | 💥🟩
🔗 OffRamp.applySourceChainConfigUpdates | 🎯💥❌ ['onlyOwner'] > 🔗 OffRamp._applySourceChainConfigUpdates | 🎯🟢🔴 > 🔗 EnumerableSet.add | > 🔗 EnumerableSet._add | > 🔗 EnumerableSet._contains | 🟩
🔗 OffRamp.applySourceChainConfigUpdates | 🎯💥❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 OffRamp.commit | 🎯💥🟢🔴 > 🔗 FeeQuoter.updatePrices | 🎯💥🔴 > 🔗 AuthorizedCallers._validateCaller | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 OffRamp.commit | 🎯💥🟢🔴 > 🔗 IPriceRegistry.updatePrices | 💥
🔗 OffRamp.commit | 🎯💥🟢🔴 > 🔗 IRMNRemote.isCursed | 🎯💥🟩
🔗 OffRamp.commit | 🎯💥🟢🔴 > 🔗 IRMNRemote.verify | 🎯💥🟩
🔗 OffRamp.commit | 🎯💥🟢🔴 > 🔗 MultiOCR3Base._transmit | 🎯🟢 > 🔗 MultiOCR3Base._verifySignatures | 🎯🟢🟩
🔗 OffRamp.commit | 🎯💥🟢🔴 > 🔗 MultiOCR3Base._transmit | 🎯🟢 > 🔗 MultiOCR3Base._whenChainNotForked | 🎯🟢🟩
🔗 OffRamp.commit | 🎯💥🟢🔴 > 🔗 OffRamp._getEnabledSourceChainConfig | 🎯🟢🟩
🔗 OffRamp.commit | 🎯💥🟢🔴 > 🔗 RMNRemote.isCursed | 🎯💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 OffRamp.commit | 🎯💥🟢🔴 > 🔗 RMNRemote.isCursed | 🎯💥🟢🟩 > 🔗 EnumerableSet.length | 🟩 > 🔗 EnumerableSet._length | 🟩
🔗 OffRamp.commit | 🎯💥🟢🔴 > 🔗 RMNRemote.verify | 🎯💥🟢🟩
🔗 OffRamp.constructor | 🎯💥🔴 > 🔗 MultiOCR3Base.constructor | 🎯🔴
🔗 OffRamp.constructor | 🎯💥🔴 > 🔗 OffRamp._applySourceChainConfigUpdates | 🎯🟢🔴 > 🔗 EnumerableSet.add | > 🔗 EnumerableSet._add | > 🔗 EnumerableSet._contains | 🟩
🔗 OffRamp.constructor | 🎯💥🔴 > 🔗 OffRamp._setDynamicConfig | 🎯🔴
🔗 OffRamp.execute | 🎯💥 > 🔗 MultiOCR3Base._transmit | 🎯🟢 > 🔗 MultiOCR3Base._verifySignatures | 🎯🟢🟩
🔗 OffRamp.execute | 🎯💥 > 🔗 MultiOCR3Base._transmit | 🎯🟢 > 🔗 MultiOCR3Base._whenChainNotForked | 🎯🟢🟩
🔗 OffRamp.execute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 INonceManager.incrementInboundNonce | 🎯💥
🔗 OffRamp.execute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 IRMNRemote.isCursed | 🎯💥🟩
🔗 OffRamp.execute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 Internal._hash | 🎯🟩
🔗 OffRamp.execute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 NonceManager.incrementInboundNonce | 🎯💥🔴❌ ['onlyAuthorizedCallers'] > 🔗 AuthorizedCallers.onlyAuthorizedCallers | 🌈 > 🔗 AuthorizedCallers._validateCaller | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 OffRamp.execute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 NonceManager.incrementInboundNonce | 🎯💥🔴❌ ['onlyAuthorizedCallers'] > 🔗 NonceManager._getInboundNonce | 🎯🟢🟩 > 🔗 IEVM2AnyOnRamp.getSenderNonce | 💥🟩
🔗 OffRamp.execute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._getEnabledSourceChainConfig | 🎯🟢🟩
🔗 OffRamp.execute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._setExecutionState | 🎯🟢🔴 > 🔗 OffRamp._getSequenceNumberBitmap | 🎯🟢🟩
🔗 OffRamp.execute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 ERC165Checker.supportsInterface | 🟩 > 🔗 ERC165Checker.supportsERC165 | 🟢🟩 > 🔗 ERC165Checker.supportsERC165InterfaceUnchecked | 🟩
🔗 OffRamp.execute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 ERC165Checker.supportsInterface | 🟩 > 🔗 ERC165Checker.supportsERC165InterfaceUnchecked | 🟩
🔗 OffRamp.execute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 IMessageInterceptor.onInboundMessage | 🎯💥
🔗 OffRamp.execute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 IRouter.routeMessage | 💥
🔗 OffRamp.execute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 MultiAggregateRateLimiter.onInboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 AuthorizedCallers.onlyAuthorizedCallers | 🌈 > 🔗 AuthorizedCallers._validateCaller | 🟢🟩
🔗 OffRamp.execute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 MultiAggregateRateLimiter.onInboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 EnumerableMapAddresses.contains | 🟩
🔗 OffRamp.execute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 MultiAggregateRateLimiter.onInboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 MultiAggregateRateLimiter._getTokenBucket | 🎯🟢🟩
🔗 OffRamp.execute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 MultiAggregateRateLimiter.onInboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 MultiAggregateRateLimiter._getTokenValue | 🎯🟢🟩
🔗 OffRamp.execute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 MultiAggregateRateLimiter.onInboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 RateLimiter._consume |
🔗 OffRamp.execute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 OffRamp._releaseOrMintTokens | 🎯 > 🔗 OffRamp._releaseOrMintSingleToken | 🎯🟢 > 🔗 CallWithExactGas._callWithExactGasSafeReturnData | 🟢
🔗 OffRamp.execute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 OffRamp._releaseOrMintTokens | 🎯 > 🔗 OffRamp._releaseOrMintSingleToken | 🎯🟢 > 🔗 ERC165Checker.supportsInterface | 🟩
🔗 OffRamp.execute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 OffRamp._releaseOrMintTokens | 🎯 > 🔗 OffRamp._releaseOrMintSingleToken | 🎯🟢 > 🔗 ITokenAdminRegistry.getPool | 💥🟩
🔗 OffRamp.execute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 OffRamp._releaseOrMintTokens | 🎯 > 🔗 OffRamp._releaseOrMintSingleToken | 🎯🟢 > 🔗 OffRamp._getBalanceOfReceiver | 🎯
🔗 OffRamp.execute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 OffRamp._releaseOrMintTokens | 🎯 > 🔗 OffRamp._releaseOrMintSingleToken | 🎯🟢 > 🔗 TokenAdminRegistry.getPool | 💥🟢🟩
🔗 OffRamp.execute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 Router.routeMessage | 💥 ['whenNotCursed'] > 🔗 CallWithExactGas._callWithExactGasSafeReturnData | 🟢
🔗 OffRamp.execute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 Router.routeMessage | 💥 ['whenNotCursed'] > 🔗 Router.isOffRamp | 💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 OffRamp.execute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 Router.routeMessage | 💥 ['whenNotCursed'] > 🔗 Router.isOffRamp | 💥🟢🟩 > 🔗 Router._mergeChainSelectorAndOffRamp | 🟩
🔗 OffRamp.execute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 Router.routeMessage | 💥 ['whenNotCursed'] > 🔗 Router.whenNotCursed | 🌈🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 OffRamp.execute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._verify | 🎯🟢🟩 > 🔗 MerkleMultiProof._merkleRoot | 🟢🟩 > 🔗 MerkleMultiProof._hashPair | 🟩 > 🔗 MerkleMultiProof._hashInternalNode | 🟢🟩
🔗 OffRamp.execute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp.getExecutionState | 🎯💥🟢🟩 > 🔗 OffRamp._getSequenceNumberBitmap | 🎯🟢🟩
🔗 OffRamp.execute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 RMNRemote.isCursed | 🎯💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 OffRamp.execute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 RMNRemote.isCursed | 🎯💥🟢🟩 > 🔗 EnumerableSet.length | 🟩 > 🔗 EnumerableSet._length | 🟩
🔗 OffRamp.getAllSourceChainConfigs | 🎯💥🟢🟩 > 🔗 EnumerableSet.at | 🟩 > 🔗 EnumerableSet._at | 🟩
🔗 OffRamp.getAllSourceChainConfigs | 🎯💥🟢🟩 > 🔗 EnumerableSet.length | 🟩 > 🔗 EnumerableSet._length | 🟩
🔗 OffRamp.manuallyExecute | 🎯💥 > 🔗 MultiOCR3Base._whenChainNotForked | 🎯🟢🟩
🔗 OffRamp.manuallyExecute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 INonceManager.incrementInboundNonce | 🎯💥
🔗 OffRamp.manuallyExecute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 IRMNRemote.isCursed | 🎯💥🟩
🔗 OffRamp.manuallyExecute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 Internal._hash | 🎯🟩
🔗 OffRamp.manuallyExecute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 NonceManager.incrementInboundNonce | 🎯💥🔴❌ ['onlyAuthorizedCallers'] > 🔗 AuthorizedCallers.onlyAuthorizedCallers | 🌈 > 🔗 AuthorizedCallers._validateCaller | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 OffRamp.manuallyExecute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 NonceManager.incrementInboundNonce | 🎯💥🔴❌ ['onlyAuthorizedCallers'] > 🔗 NonceManager._getInboundNonce | 🎯🟢🟩 > 🔗 IEVM2AnyOnRamp.getSenderNonce | 💥🟩
🔗 OffRamp.manuallyExecute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._getEnabledSourceChainConfig | 🎯🟢🟩
🔗 OffRamp.manuallyExecute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._setExecutionState | 🎯🟢🔴 > 🔗 OffRamp._getSequenceNumberBitmap | 🎯🟢🟩
🔗 OffRamp.manuallyExecute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 ERC165Checker.supportsInterface | 🟩 > 🔗 ERC165Checker.supportsERC165 | 🟢🟩 > 🔗 ERC165Checker.supportsERC165InterfaceUnchecked | 🟩
🔗 OffRamp.manuallyExecute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 ERC165Checker.supportsInterface | 🟩 > 🔗 ERC165Checker.supportsERC165InterfaceUnchecked | 🟩
🔗 OffRamp.manuallyExecute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 IMessageInterceptor.onInboundMessage | 🎯💥
🔗 OffRamp.manuallyExecute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 IRouter.routeMessage | 💥
🔗 OffRamp.manuallyExecute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 MultiAggregateRateLimiter.onInboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 AuthorizedCallers.onlyAuthorizedCallers | 🌈 > 🔗 AuthorizedCallers._validateCaller | 🟢🟩
🔗 OffRamp.manuallyExecute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 MultiAggregateRateLimiter.onInboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 EnumerableMapAddresses.contains | 🟩
🔗 OffRamp.manuallyExecute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 MultiAggregateRateLimiter.onInboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 MultiAggregateRateLimiter._getTokenBucket | 🎯🟢🟩
🔗 OffRamp.manuallyExecute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 MultiAggregateRateLimiter.onInboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 MultiAggregateRateLimiter._getTokenValue | 🎯🟢🟩
🔗 OffRamp.manuallyExecute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 MultiAggregateRateLimiter.onInboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 RateLimiter._consume |
🔗 OffRamp.manuallyExecute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 OffRamp._releaseOrMintTokens | 🎯 > 🔗 OffRamp._releaseOrMintSingleToken | 🎯🟢 > 🔗 CallWithExactGas._callWithExactGasSafeReturnData | 🟢
🔗 OffRamp.manuallyExecute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 OffRamp._releaseOrMintTokens | 🎯 > 🔗 OffRamp._releaseOrMintSingleToken | 🎯🟢 > 🔗 ERC165Checker.supportsInterface | 🟩
🔗 OffRamp.manuallyExecute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 OffRamp._releaseOrMintTokens | 🎯 > 🔗 OffRamp._releaseOrMintSingleToken | 🎯🟢 > 🔗 ITokenAdminRegistry.getPool | 💥🟩
🔗 OffRamp.manuallyExecute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 OffRamp._releaseOrMintTokens | 🎯 > 🔗 OffRamp._releaseOrMintSingleToken | 🎯🟢 > 🔗 OffRamp._getBalanceOfReceiver | 🎯
🔗 OffRamp.manuallyExecute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 OffRamp._releaseOrMintTokens | 🎯 > 🔗 OffRamp._releaseOrMintSingleToken | 🎯🟢 > 🔗 TokenAdminRegistry.getPool | 💥🟢🟩
🔗 OffRamp.manuallyExecute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 Router.routeMessage | 💥 ['whenNotCursed'] > 🔗 CallWithExactGas._callWithExactGasSafeReturnData | 🟢
🔗 OffRamp.manuallyExecute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 Router.routeMessage | 💥 ['whenNotCursed'] > 🔗 Router.isOffRamp | 💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 OffRamp.manuallyExecute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 Router.routeMessage | 💥 ['whenNotCursed'] > 🔗 Router.isOffRamp | 💥🟢🟩 > 🔗 Router._mergeChainSelectorAndOffRamp | 🟩
🔗 OffRamp.manuallyExecute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._trialExecute | 🎯 > 🔗 OffRamp.executeSingleMessage | 🎯💥🟢 > 🔗 Router.routeMessage | 💥 ['whenNotCursed'] > 🔗 Router.whenNotCursed | 🌈🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 OffRamp.manuallyExecute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp._verify | 🎯🟢🟩 > 🔗 MerkleMultiProof._merkleRoot | 🟢🟩 > 🔗 MerkleMultiProof._hashPair | 🟩 > 🔗 MerkleMultiProof._hashInternalNode | 🟢🟩
🔗 OffRamp.manuallyExecute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 OffRamp.getExecutionState | 🎯💥🟢🟩 > 🔗 OffRamp._getSequenceNumberBitmap | 🎯🟢🟩
🔗 OffRamp.manuallyExecute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 RMNRemote.isCursed | 🎯💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 OffRamp.manuallyExecute | 🎯💥 > 🔗 OffRamp._batchExecute | 🎯 > 🔗 OffRamp._executeSingleReport | 🎯🟢 > 🔗 RMNRemote.isCursed | 🎯💥🟢🟩 > 🔗 EnumerableSet.length | 🟩 > 🔗 EnumerableSet._length | 🟩
🔗 OffRamp.setDynamicConfig | 🎯💥❌ ['onlyOwner'] > 🔗 OffRamp._setDynamicConfig | 🎯🔴
🔗 OffRamp.setDynamicConfig | 🎯💥❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burnFrom | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burnFrom | 💥 > 🔗 ERC20._spendAllowance | > 🔗 FactoryBurnMintERC20._approve | ['validAddress(address)'] > 🔗 ERC20._approve | 🔴
🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burnFrom | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burnFrom | 💥 > 🔗 ERC20._spendAllowance | > 🔗 FactoryBurnMintERC20._approve | ['validAddress(address)'] > 🔗 FactoryBurnMintERC20.validAddress | 🌈
🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burnFrom | 💥❌ ['onlyBurner'] > 🔗 FactoryBurnMintERC20.onlyBurner | 🌈 > 🔗 FactoryBurnMintERC20.isBurner | 💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burn | 💥 > 🔗 ERC20._burn | 🟢🔴 > 🔗 ERC20._afterTokenTransfer |
🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burn | 💥 > 🔗 ERC20._burn | 🟢🔴 > 🔗 ERC20._beforeTokenTransfer |
🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner'] > 🔗 FactoryBurnMintERC20.onlyBurner | 🌈 > 🔗 FactoryBurnMintERC20.isBurner | 💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner'] > 🔗 FactoryBurnMintERC20.onlyBurner | 🌈 > 🔗 FactoryBurnMintERC20.isBurner | 💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnWithFromMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥 > 🔗 FactoryBurnMintERC20.burnFrom | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burnFrom | 💥 > 🔗 ERC20._burn | 🟢🔴 > 🔗 ERC20._afterTokenTransfer |
🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnWithFromMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥 > 🔗 FactoryBurnMintERC20.burnFrom | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burnFrom | 💥 > 🔗 ERC20._burn | 🟢🔴 > 🔗 ERC20._beforeTokenTransfer |
🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnWithFromMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥 > 🔗 FactoryBurnMintERC20.burnFrom | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burnFrom | 💥 > 🔗 ERC20._spendAllowance | > 🔗 ERC20.allowance | 💥🟢🟩
🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnWithFromMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥 > 🔗 FactoryBurnMintERC20.burnFrom | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burnFrom | 💥 > 🔗 ERC20._spendAllowance | > 🔗 FactoryBurnMintERC20._approve | ['validAddress(address)']
🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnWithFromMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥 > 🔗 FactoryBurnMintERC20.burnFrom | 💥❌ ['onlyBurner'] > 🔗 FactoryBurnMintERC20.onlyBurner | 🌈 > 🔗 FactoryBurnMintERC20.isBurner | 💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢 > 🔗 RateLimiter._consume | > 🔗 RateLimiter._calculateRefill | 🟩
🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢 > 🔗 RateLimiter._consume | > 🔗 RateLimiter._calculateRefill | 🟩 > 🔗 RateLimiter._min | 🟩
🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 TokenPool.isSupportedChain | 💥🟢🟩
🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 TokenPool.isSupportedChain | 💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool.isSupportedToken | 💥🟢🟩
🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner'] > 🔗 FactoryBurnMintERC20.onlyBurner | 🌈 > 🔗 FactoryBurnMintERC20.isBurner | 💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢 > 🔗 RateLimiter._consume | > 🔗 RateLimiter._calculateRefill | 🟩 > 🔗 RateLimiter._min | 🟩
🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 TokenPool.isSupportedChain | 💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢 > 🔗 RateLimiter._consume | > 🔗 RateLimiter._calculateRefill | 🟩 > 🔗 RateLimiter._min | 🟩
🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 TokenPool.isSupportedChain | 💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 IPoolV1.lockOrBurn | 💥
🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢 > 🔗 RateLimiter._consume | > 🔗 RateLimiter._calculateRefill | 🟩 > 🔗 RateLimiter._min | 🟩
🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 TokenPool.isSupportedChain | 💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 OnRamp.applyAllowlistUpdates | 🎯💥🟢🔴 > 🔗 EnumerableSet.add | > 🔗 EnumerableSet._add | > 🔗 EnumerableSet._contains | 🟩
🔗 OnRamp.applyAllowlistUpdates | 🎯💥🟢🔴 > 🔗 EnumerableSet.remove | > 🔗 EnumerableSet._remove |
🔗 OnRamp.applyAllowlistUpdates | 🎯💥🟢🔴 > 🔗 Ownable2Step.owner | 💥🟢🟩
🔗 OnRamp.applyDestChainConfigUpdates | 🎯💥❌ ['onlyOwner'] > 🔗 OnRamp._applyDestChainConfigUpdates | 🎯🟢🔴
🔗 OnRamp.applyDestChainConfigUpdates | 🎯💥❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 OnRamp.constructor | 🎯💥🔴 > 🔗 OnRamp._applyDestChainConfigUpdates | 🎯🟢🔴
🔗 OnRamp.constructor | 🎯💥🔴 > 🔗 OnRamp._setDynamicConfig | 🎯🟢🔴
🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burnFrom | 💥 > 🔗 ERC20._spendAllowance | > 🔗 FactoryBurnMintERC20._approve | ['validAddress(address)'] > 🔗 ERC20._approve | 🔴
🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burnFrom | 💥 > 🔗 ERC20._spendAllowance | > 🔗 FactoryBurnMintERC20._approve | ['validAddress(address)'] > 🔗 FactoryBurnMintERC20.validAddress | 🌈
🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burnFrom | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burnFrom | 💥 > 🔗 ERC20._burn | 🟢🔴 > 🔗 ERC20._afterTokenTransfer |
🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burnFrom | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burnFrom | 💥 > 🔗 ERC20._burn | 🟢🔴 > 🔗 ERC20._beforeTokenTransfer |
🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burnFrom | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burnFrom | 💥 > 🔗 ERC20._spendAllowance | > 🔗 ERC20.allowance | 💥🟢🟩
🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burnFrom | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burnFrom | 💥 > 🔗 ERC20._spendAllowance | > 🔗 FactoryBurnMintERC20._approve | ['validAddress(address)']
🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burnFrom | 💥❌ ['onlyBurner'] > 🔗 FactoryBurnMintERC20.onlyBurner | 🌈 > 🔗 FactoryBurnMintERC20.isBurner | 💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burn | 💥 > 🔗 ERC20._burn | 🟢🔴 > 🔗 ERC20._beforeTokenTransfer |
🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burn | 💥 > 🔗 ERC20._burn | 🟢🔴 > 🔗 ERC20._afterTokenTransfer |
🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burn | 💥 > 🔗 ERC20._burn | 🟢🔴 > 🔗 ERC20._beforeTokenTransfer |
🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner'] > 🔗 FactoryBurnMintERC20.onlyBurner | 🌈 > 🔗 FactoryBurnMintERC20.isBurner | 💥🟢🟩
🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner'] > 🔗 FactoryBurnMintERC20.onlyBurner | 🌈 > 🔗 FactoryBurnMintERC20.isBurner | 💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnWithFromMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥 > 🔗 FactoryBurnMintERC20.burnFrom | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burnFrom | 💥 > 🔗 Context._msgSender | 🟩
🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnWithFromMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥 > 🔗 FactoryBurnMintERC20.burnFrom | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burnFrom | 💥 > 🔗 ERC20._burn | 🟢🔴
🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnWithFromMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥 > 🔗 FactoryBurnMintERC20.burnFrom | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burnFrom | 💥 > 🔗 ERC20._spendAllowance |
🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnWithFromMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥 > 🔗 FactoryBurnMintERC20.burnFrom | 💥❌ ['onlyBurner'] > 🔗 FactoryBurnMintERC20.onlyBurner | 🌈 > 🔗 FactoryBurnMintERC20.isBurner | 💥🟢🟩
🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢 > 🔗 RateLimiter._consume | > 🔗 RateLimiter._calculateRefill | 🟩 > 🔗 RateLimiter._min | 🟩
🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 IRouter.getOnRamp | 💥🟩
🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 TokenPool.isSupportedChain | 💥🟢🟩
🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 TokenPool.isSupportedChain | 💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burn | 💥 > 🔗 ERC20._burn | 🟢🔴 > 🔗 ERC20._afterTokenTransfer |
🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burn | 💥 > 🔗 ERC20._burn | 🟢🔴 > 🔗 ERC20._beforeTokenTransfer |
🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner'] > 🔗 FactoryBurnMintERC20.onlyBurner | 🌈 > 🔗 FactoryBurnMintERC20.isBurner | 💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢 > 🔗 RateLimiter._consume | > 🔗 RateLimiter._calculateRefill | 🟩 > 🔗 RateLimiter._min | 🟩
🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 TokenPool.isSupportedChain | 💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢 > 🔗 RateLimiter._consume | > 🔗 RateLimiter._calculateRefill | 🟩
🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 TokenPool.isSupportedChain | 💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢 > 🔗 RateLimiter._consume | > 🔗 RateLimiter._calculateRefill | 🟩
🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 TokenPool.isSupportedChain | 💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 IERC165.supportsInterface | 💥🟩
🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢 > 🔗 RateLimiter._consume | > 🔗 RateLimiter._calculateRefill | 🟩 > 🔗 RateLimiter._min | 🟩
🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 TokenPool.isSupportedChain | 💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢 > 🔗 RateLimiter._consume | > 🔗 RateLimiter._calculateRefill | 🟩 > 🔗 RateLimiter._min | 🟩
🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 TokenPool.isSupportedChain | 💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 OnRamp.getAllowedSendersList | 🎯💥🟢🟩 > 🔗 EnumerableSet.values | 🟩 > 🔗 EnumerableSet._values | 🟩
🔗 OnRamp.setDynamicConfig | 🎯💥❌ ['onlyOwner'] > 🔗 OnRamp._setDynamicConfig | 🎯🟢🔴
🔗 OnRamp.setDynamicConfig | 🎯💥❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 OnRamp.withdrawFeeTokens | 🎯💥🟢 > 🔗 ERC20.balanceOf | 💥🟢🟩
🔗 OnRamp.withdrawFeeTokens | 🎯💥🟢 > 🔗 IERC20.balanceOf | 💥🟩
🔗 OnRamp.withdrawFeeTokens | 🎯💥🟢 > 🔗 SafeERC20.safeTransfer | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address._revert | 🟩
🔗 OnRamp.withdrawFeeTokens | 🎯💥🟢 > 🔗 SafeERC20.safeTransfer | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address.isContract | 🟩
🔗 Ownable2Step.constructor | 💥🔴 > 🔗 Ownable2Step._transferOwnership | 🟢🔴
🔗 Ownable2Step.transferOwnership | 💥❌ ['onlyOwner'] > 🔗 Ownable2Step._transferOwnership | 🟢🔴
🔗 Ownable2Step.transferOwnership | 💥❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 Ownable2StepMsgSender.constructor | 💥 > 🔗 Ownable2Step.constructor | 💥🔴 > 🔗 Ownable2Step._transferOwnership | 🟢🔴
🔗 OwnerIsCreator.constructor | 💥 > 🔗 ConfirmedOwner.constructor | 💥 > 🔗 ConfirmedOwnerWithProposal.constructor | 💥🔴 > 🔗 ConfirmedOwnerWithProposal._transferOwnership | 🟢🔴
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 IEVM2AnyOnRampClient.getPoolBySourceToken | 💥🟩
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 FeeQuoter.processMessageArgs | 🎯💥🟢🟩 > 🔗 FeeQuoter._processPoolReturnData | 🎯🟢🟩 > 🔗 FeeQuoter._validateDestFamilyAddress | 🎯🟩 > 🔗 Internal._validateEVMAddress | 🎯🟢🟩
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 FeeQuoter.processMessageArgs | 🎯💥🟢🟩 > 🔗 FeeQuoter.convertTokenAmount | 🎯💥🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 AuthorizedCallers.onlyAuthorizedCallers | 🌈 > 🔗 AuthorizedCallers._validateCaller | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 EnumerableMapAddresses.contains | 🟩 > 🔗 EnumerableMapBytes32.contains | 🟩
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 MultiAggregateRateLimiter._getTokenValue | 🎯🟢🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 MultiAggregateRateLimiter._getTokenValue | 🎯🟢🟩 > 🔗 IPriceRegistry.getTokenPrice | 💥🟩
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 MultiAggregateRateLimiter._getTokenValue | 🎯🟢🟩 > 🔗 USDPriceWith18Decimals._calcUSDValueFromTokenAmount | 🟩
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 RateLimiter._consume | > 🔗 RateLimiter._calculateRefill | 🟩
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 NonceManager.getIncrementedOutboundNonce | 🎯💥🔴❌ ['onlyAuthorizedCallers'] > 🔗 AuthorizedCallers.onlyAuthorizedCallers | 🌈 > 🔗 AuthorizedCallers._validateCaller | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burnFrom | 💥
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burnFrom | 💥❌ ['onlyBurner']
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 IBurnMintERC20.burnFrom | 💥
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burn | 💥
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner']
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 IBurnMintERC20.burn | 💥
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnWithFromMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnWithFromMintTokenPool._burn | 🟢 > 🔗 IBurnMintERC20.burn | 💥
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool.isSupportedToken | 💥🟢🟩
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool.getRemoteToken | 💥🟢🟩
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burn | 💥
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner']
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 IBurnMintERC20.burn | 💥
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool.isSupportedToken | 💥🟢🟩
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool._validateLockOrBurn | 🟢
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool.getRemoteToken | 💥🟢🟩
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 ITokenMessenger.depositForBurnWithCaller | 💥
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool.getRemoteToken | 💥🟢🟩
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 IERC165.supportsInterface | 💥🟩
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 IPoolV1.lockOrBurn | 💥
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool.isSupportedToken | 💥🟢🟩
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 ITokenMessenger.depositForBurnWithCaller | 💥
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool.isSupportedToken | 💥🟢🟩
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool.getRemoteToken | 💥🟢🟩
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenTransferCost | 🎯🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._validateMessage | 🎯🟩 > 🔗 FeeQuoter._validateDestFamilyAddress | 🎯🟩 > 🔗 Internal._validateEVMAddress | 🎯🟢🟩
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 SafeERC20.safeTransfer | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩
🔗 PingPongDemo._ccipReceive | 🟢 > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 SafeERC20.safeTransferFrom | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 IEVM2AnyOnRampClient.forwardFromRouter | 💥
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 IEVM2AnyOnRampClient.getFee | 💥🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 FeeQuoter.processMessageArgs | 🎯💥🟢🟩 > 🔗 FeeQuoter.convertTokenAmount | 🎯💥🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 AuthorizedCallers.onlyAuthorizedCallers | 🌈 > 🔗 AuthorizedCallers._validateCaller | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 EnumerableMapAddresses.contains | 🟩 > 🔗 EnumerableMapBytes32.contains | 🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 MultiAggregateRateLimiter._getTokenValue | 🎯🟢🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 RateLimiter._consume | > 🔗 RateLimiter._calculateRefill | 🟩 > 🔗 RateLimiter._min | 🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 NonceManager.getIncrementedOutboundNonce | 🎯💥🔴❌ ['onlyAuthorizedCallers'] > 🔗 AuthorizedCallers.onlyAuthorizedCallers | 🌈 > 🔗 AuthorizedCallers._validateCaller | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burnFrom | 💥 > 🔗 Context._msgSender | 🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burnFrom | 💥 > 🔗 ERC20._burn | 🟢🔴
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burnFrom | 💥 > 🔗 ERC20._spendAllowance |
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burnFrom | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burnFrom | 💥
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burnFrom | 💥❌ ['onlyBurner'] > 🔗 FactoryBurnMintERC20.onlyBurner | 🌈
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burn | 💥 > 🔗 Context._msgSender | 🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burn | 💥 > 🔗 ERC20._burn | 🟢🔴
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burn | 💥
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner'] > 🔗 FactoryBurnMintERC20.onlyBurner | 🌈
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 IBurnMintERC20.burn | 💥
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnWithFromMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥 > 🔗 FactoryBurnMintERC20.burnFrom | 💥❌ ['onlyBurner']
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢 > 🔗 RateLimiter._consume |
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 IRouter.getOnRamp | 💥🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 Router.getOnRamp | 💥🟢🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 TokenPool.isSupportedChain | 💥🟢🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool.isSupportedToken | 💥🟢🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool.getRemoteToken | 💥🟢🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burn | 💥 > 🔗 Context._msgSender | 🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burn | 💥 > 🔗 ERC20._burn | 🟢🔴
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burn | 💥
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner'] > 🔗 FactoryBurnMintERC20.onlyBurner | 🌈
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢 > 🔗 RateLimiter._consume |
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 IRouter.getOnRamp | 💥🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 Router.getOnRamp | 💥🟢🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 TokenPool.isSupportedChain | 💥🟢🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 CCIPReceiver.supportsInterface | 💥🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool.isSupportedToken | 💥🟢🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool.isSupportedToken | 💥🟢🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 IERC165.supportsInterface | 💥🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 IPoolV1.lockOrBurn | 💥
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢 > 🔗 RateLimiter._consume |
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 IRouter.getOnRamp | 💥🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 Router.getOnRamp | 💥🟢🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 TokenPool.isSupportedChain | 💥🟢🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 TokenPool.supportsInterface | 💥🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢 > 🔗 RateLimiter._consume |
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 IRouter.getOnRamp | 💥🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 Router.getOnRamp | 💥🟢🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 TokenPool.isSupportedChain | 💥🟢🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenTransferCost | 🎯🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 AggregatorV3Interface.decimals | 💥🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 AggregatorV3Interface.latestRoundData | 💥🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 FeeQuoter._calculateRebasedValue | 🎯🟢🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 SafeERC20.safeTransfer | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address._revert | 🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 SafeERC20.safeTransfer | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address.isContract | 🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 SafeERC20.safeTransferFrom | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address._revert | 🟩
🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 SafeERC20.safeTransferFrom | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address.isContract | 🟩
🔗 PingPongDemo.constructor | 💥🟢🔴 > 🔗 CCIPReceiver.constructor | 🔴
🔗 PingPongDemo.constructor | 💥🟢🔴 > 🔗 ERC20.approve | 💥
🔗 PingPongDemo.constructor | 💥🟢🔴 > 🔗 ERC20.approve | 💥 > 🔗 Context._msgSender | 🟩
🔗 PingPongDemo.constructor | 💥🟢🔴 > 🔗 ERC20.approve | 💥 > 🔗 ERC20._approve | 🔴
🔗 PingPongDemo.constructor | 💥🟢🔴 > 🔗 ERC20.approve | 💥 > 🔗 FactoryBurnMintERC20._approve | ['validAddress(address)'] > 🔗 ERC20._approve | 🔴
🔗 PingPongDemo.constructor | 💥🟢🔴 > 🔗 ERC20.approve | 💥 > 🔗 FactoryBurnMintERC20._approve | ['validAddress(address)'] > 🔗 FactoryBurnMintERC20.validAddress | 🌈
🔗 PingPongDemo.constructor | 💥🟢🔴 > 🔗 IERC20.approve | 💥
🔗 PingPongDemo.setCounterpart | 💥🔴❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 PingPongDemo.setCounterpartAddress | 💥🔴❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 PingPongDemo.setCounterpartChainSelector | 💥🔴❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 PingPongDemo.setOutOfOrderExecution | 💥🔴❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 PingPongDemo.setPaused | 💥🔴❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 CCIPReceiver.getRouter | 💥🟢🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Client._argsToBytes | 🎯🟢🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 IRouterClient.ccipSend | 💥💲
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 IEVM2AnyOnRampClient.forwardFromRouter | 💥
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 IEVM2AnyOnRampClient.getFee | 💥🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 IEVM2AnyOnRampClient.getPoolBySourceToken | 💥🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 IWrappedNative.deposit | 💥💲
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 FeeQuoter.processMessageArgs | 🎯💥🟢🟩 > 🔗 Client._argsToBytes | 🎯🟢🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 FeeQuoter.processMessageArgs | 🎯💥🟢🟩 > 🔗 FeeQuoter._parseUnvalidatedEVMExtraArgsFromBytes | 🎯🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 FeeQuoter.processMessageArgs | 🎯💥🟢🟩 > 🔗 FeeQuoter._processPoolReturnData | 🎯🟢🟩 > 🔗 FeeQuoter._validateDestFamilyAddress | 🎯🟩 > 🔗 Internal._validateEVMAddress | 🎯🟢🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 FeeQuoter.processMessageArgs | 🎯💥🟢🟩 > 🔗 FeeQuoter.convertTokenAmount | 🎯💥🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 IFeeQuoter.processMessageArgs | 🎯💥🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 IMessageInterceptor.onOutboundMessage | 🎯💥
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 INonceManager.getIncrementedOutboundNonce | 🎯💥
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 Internal._hash | 🎯🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 AuthorizedCallers.onlyAuthorizedCallers | 🌈 > 🔗 AuthorizedCallers._validateCaller | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 EnumerableMapAddresses.contains | 🟩 > 🔗 EnumerableMapBytes32.contains | 🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 MultiAggregateRateLimiter._getTokenBucket | 🎯🟢🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 MultiAggregateRateLimiter._getTokenValue | 🎯🟢🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 MultiAggregateRateLimiter._getTokenValue | 🎯🟢🟩 > 🔗 IPriceRegistry.getTokenPrice | 💥🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 MultiAggregateRateLimiter._getTokenValue | 🎯🟢🟩 > 🔗 USDPriceWith18Decimals._calcUSDValueFromTokenAmount | 🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 RateLimiter._consume | > 🔗 RateLimiter._calculateRefill | 🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 NonceManager.getIncrementedOutboundNonce | 🎯💥🔴❌ ['onlyAuthorizedCallers'] > 🔗 AuthorizedCallers.onlyAuthorizedCallers | 🌈 > 🔗 AuthorizedCallers._validateCaller | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 NonceManager.getIncrementedOutboundNonce | 🎯💥🔴❌ ['onlyAuthorizedCallers'] > 🔗 NonceManager._getOutboundNonce | 🎯🟢🟩 > 🔗 IEVM2AnyOnRamp.getSenderNonce | 💥🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burnFrom | 💥
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burnFrom | 💥❌ ['onlyBurner']
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 IBurnMintERC20.burnFrom | 💥
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burn | 💥
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner']
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 IBurnMintERC20.burn | 💥
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPoolAbstract._burn |
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnWithFromMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnWithFromMintTokenPool._burn | 🟢 > 🔗 IBurnMintERC20.burn | 💥
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool.isSupportedToken | 💥🟢🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool.getRemoteToken | 💥🟢🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burn | 💥
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner']
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 IBurnMintERC20.burn | 💥
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool.isSupportedToken | 💥🟢🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool.getRemoteToken | 💥🟢🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 CCIPHome.supportsInterface | 🎯💥🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 CCIPReceiver.supportsInterface | 💥🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 FactoryBurnMintERC20.supportsInterface | 💥🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool._validateLockOrBurn | 🟢
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool.getRemoteToken | 💥🟢🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool.shouldUseLockRelease | 💥🟢🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 ITokenMessenger.depositForBurnWithCaller | 💥
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool.getRemoteToken | 💥🟢🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 IERC165.supportsInterface | 💥🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 IERC165.supportsInterface | 💥🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 IPoolV1.lockOrBurn | 💥
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool.isSupportedToken | 💥🟢🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool.getRemoteToken | 💥🟢🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.supportsInterface | 💥🟩 > 🔗 TokenPool.supportsInterface | 💥🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 OnRamp.getPoolBySourceToken | 🎯💥🟢🟩 > 🔗 ITokenAdminRegistry.getPool | 💥🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 OnRamp.getPoolBySourceToken | 🎯💥🟢🟩 > 🔗 TokenAdminRegistry.getPool | 💥🟢🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 TokenPool.supportsInterface | 💥🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 ITokenMessenger.depositForBurnWithCaller | 💥
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool.isSupportedToken | 💥🟢🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool.getRemoteToken | 💥🟢🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getDataAvailabilityCost | 🎯🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenTransferCost | 🎯🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenTransferCost | 🎯🟢🟩 > 🔗 USDPriceWith18Decimals._calcUSDValueFromTokenAmount | 🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getValidatedGasPrice | 🎯🟢🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._parseEVMExtraArgsFromBytes | 🎯🟩 > 🔗 FeeQuoter._parseUnvalidatedEVMExtraArgsFromBytes | 🎯🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._validateMessage | 🎯🟩 > 🔗 FeeQuoter._validateDestFamilyAddress | 🎯🟩 > 🔗 Internal._validateEVMAddress | 🎯🟢🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 IFeeQuoter.getValidatedFee | 🎯💥🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 IRMNRemote.isCursed | 🎯💥🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 RMNRemote.isCursed | 🎯💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 RMNRemote.isCursed | 🎯💥🟢🟩 > 🔗 EnumerableSet.length | 🟩 > 🔗 EnumerableSet._length | 🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getPoolBySourceToken | 🎯💥🟢🟩 > 🔗 ITokenAdminRegistry.getPool | 💥🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getPoolBySourceToken | 🎯💥🟢🟩 > 🔗 TokenAdminRegistry.getPool | 💥🟢🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 Router.whenNotCursed | 🌈🟢 > 🔗 IRMN.isCursed | 🎯💥🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 SafeERC20.safeTransfer | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩
🔗 PingPongDemo.startPingPong | 💥🔴❌ ['onlyOwner'] > 🔗 PingPongDemo._respond | 🟢 > 🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 SafeERC20.safeTransferFrom | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩
🔗 RMNHome.getActiveDigest | 🎯💥🟢🟩 > 🔗 RMNHome._getActiveIndex | 🎯🟢🟩
🔗 RMNHome.getAllConfigs | 🎯💥🟢🟩 > 🔗 RMNHome._getActiveIndex | 🎯🟢🟩
🔗 RMNHome.getAllConfigs | 🎯💥🟢🟩 > 🔗 RMNHome._getCandidateIndex | 🎯🟢🟩
🔗 RMNHome.getConfigDigests | 🎯💥🟢🟩 > 🔗 RMNHome._getActiveIndex | 🎯🟢🟩
🔗 RMNHome.getConfigDigests | 🎯💥🟢🟩 > 🔗 RMNHome._getCandidateIndex | 🎯🟢🟩
🔗 RMNHome.promoteCandidateAndRevokeActive | 🎯💥🟢🔴❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 RMNHome.promoteCandidateAndRevokeActive | 🎯💥🟢🔴❌ ['onlyOwner'] > 🔗 RMNHome._getActiveIndex | 🎯🟢🟩
🔗 RMNHome.promoteCandidateAndRevokeActive | 🎯💥🟢🔴❌ ['onlyOwner'] > 🔗 RMNHome._getCandidateIndex | 🎯🟢🟩
🔗 RMNHome.revokeCandidate | 🎯💥🟢🔴❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 RMNHome.revokeCandidate | 🎯💥🟢🔴❌ ['onlyOwner'] > 🔗 RMNHome._getCandidateIndex | 🎯🟢🟩
🔗 RMNHome.setCandidate | 🎯💥🟢🔴❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 RMNHome.setCandidate | 🎯💥🟢🔴❌ ['onlyOwner'] > 🔗 RMNHome._calculateConfigDigest | 🎯🟢🟩
🔗 RMNHome.setCandidate | 🎯💥🟢🔴❌ ['onlyOwner'] > 🔗 RMNHome._getCandidateIndex | 🎯🟢🟩
🔗 RMNHome.setCandidate | 🎯💥🟢🔴❌ ['onlyOwner'] > 🔗 RMNHome._validateStaticAndDynamicConfig | 🎯🟢🟩 > 🔗 RMNHome._validateDynamicConfig | 🎯🟩
🔗 RMNHome.setCandidate | 🎯💥🟢🔴❌ ['onlyOwner'] > 🔗 RMNHome.getCandidateDigest | 🎯💥🟢🟩 > 🔗 RMNHome._getCandidateIndex | 🎯🟢🟩
🔗 RMNHome.setDynamicConfig | 🎯💥🟢🔴❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 RMNHome.setDynamicConfig | 🎯💥🟢🔴❌ ['onlyOwner'] > 🔗 RMNHome._validateDynamicConfig | 🎯🟩
🔗 RMNRemote.curse | 🎯💥 > 🔗 RMNRemote.curse | 🎯💥🟢❌ ['onlyOwner'] > 🔗 EnumerableSet.add | > 🔗 EnumerableSet._add | > 🔗 EnumerableSet._contains | 🟩
🔗 RMNRemote.curse | 🎯💥 > 🔗 RMNRemote.curse | 🎯💥🟢❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 RMNRemote.getCursedSubjects | 🎯💥🟢🟩 > 🔗 EnumerableSet.values | 🟩 > 🔗 EnumerableSet._values | 🟩
🔗 RMNRemote.isCursed | 🎯💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 RMNRemote.isCursed | 🎯💥🟢🟩 > 🔗 EnumerableSet.length | 🟩 > 🔗 EnumerableSet._length | 🟩
🔗 RMNRemote.setConfig | 🎯💥🟢🔴❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 RMNRemote.uncurse | 🎯💥 > 🔗 RMNRemote.uncurse | 🎯💥🟢❌ ['onlyOwner'] > 🔗 EnumerableSet.remove | > 🔗 EnumerableSet._remove |
🔗 RMNRemote.uncurse | 🎯💥 > 🔗 RMNRemote.uncurse | 🎯💥🟢❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 RegistryModuleOwnerCustom.registerAdminViaGetCCIPAdmin | 💥 > 🔗 FactoryBurnMintERC20.getCCIPAdmin | 💥🟢🟩
🔗 RegistryModuleOwnerCustom.registerAdminViaGetCCIPAdmin | 💥 > 🔗 IGetCCIPAdmin.getCCIPAdmin | 💥🟩
🔗 RegistryModuleOwnerCustom.registerAdminViaGetCCIPAdmin | 💥 > 🔗 RegistryModuleOwnerCustom._registerAdmin | 🟢 > 🔗 ITokenAdminRegistry.proposeAdministrator | 💥
🔗 RegistryModuleOwnerCustom.registerAdminViaGetCCIPAdmin | 💥 > 🔗 RegistryModuleOwnerCustom._registerAdmin | 🟢 > 🔗 TokenAdminRegistry.proposeAdministrator | 💥🟢🔴 > 🔗 EnumerableSet.add | > 🔗 EnumerableSet._add | > 🔗 EnumerableSet._contains | 🟩
🔗 RegistryModuleOwnerCustom.registerAdminViaGetCCIPAdmin | 💥 > 🔗 RegistryModuleOwnerCustom._registerAdmin | 🟢 > 🔗 TokenAdminRegistry.proposeAdministrator | 💥🟢🔴 > 🔗 Ownable2Step.owner | 💥🟢🟩
🔗 RegistryModuleOwnerCustom.registerAdminViaGetCCIPAdmin | 💥 > 🔗 RegistryModuleOwnerCustom._registerAdmin | 🟢 > 🔗 TokenAdminRegistry.proposeAdministrator | 💥🟢🔴 > 🔗 TokenAdminRegistry.isRegistryModule | 💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 Router.applyRampUpdates | 💥🟢🔴❌ ['onlyOwner'] > 🔗 ConfirmedOwnerWithProposal.onlyOwner | 🌈 > 🔗 ConfirmedOwnerWithProposal._validateOwnership | 🟢🟩
🔗 Router.applyRampUpdates | 💥🟢🔴❌ ['onlyOwner'] > 🔗 EnumerableSet.add | > 🔗 EnumerableSet._add | > 🔗 EnumerableSet._contains | 🟩
🔗 Router.applyRampUpdates | 💥🟢🔴❌ ['onlyOwner'] > 🔗 EnumerableSet.remove | > 🔗 EnumerableSet._remove |
🔗 Router.applyRampUpdates | 💥🟢🔴❌ ['onlyOwner'] > 🔗 Router._mergeChainSelectorAndOffRamp | 🟩
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 FeeQuoter.processMessageArgs | 🎯💥🟢🟩 > 🔗 FeeQuoter.convertTokenAmount | 🎯💥🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 AggregatorV3Interface.decimals | 💥🟩
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 FeeQuoter.processMessageArgs | 🎯💥🟢🟩 > 🔗 FeeQuoter.convertTokenAmount | 🎯💥🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 AggregatorV3Interface.latestRoundData | 💥🟩
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 FeeQuoter.processMessageArgs | 🎯💥🟢🟩 > 🔗 FeeQuoter.convertTokenAmount | 🎯💥🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 FeeQuoter._calculateRebasedValue | 🎯🟢🟩
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 EnumerableMapAddresses.contains | 🟩 > 🔗 EnumerableMapBytes32.contains | 🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 MultiAggregateRateLimiter._getTokenValue | 🎯🟢🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 AggregatorV3Interface.decimals | 💥🟩
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 MultiAggregateRateLimiter._getTokenValue | 🎯🟢🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 AggregatorV3Interface.latestRoundData | 💥🟩
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 MultiAggregateRateLimiter.onOutboundMessage | 🎯💥❌ ['onlyAuthorizedCallers'] > 🔗 MultiAggregateRateLimiter._applyRateLimit | 🎯🟢 > 🔗 MultiAggregateRateLimiter._getTokenValue | 🎯🟢🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 FeeQuoter._calculateRebasedValue | 🎯🟢🟩
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burnFrom | 💥 > 🔗 ERC20._burn | 🟢🔴 > 🔗 ERC20._afterTokenTransfer |
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burnFrom | 💥 > 🔗 ERC20._burn | 🟢🔴 > 🔗 ERC20._beforeTokenTransfer |
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burnFrom | 💥 > 🔗 ERC20._spendAllowance | > 🔗 ERC20.allowance | 💥🟢🟩
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burnFrom | 💥 > 🔗 ERC20._spendAllowance | > 🔗 FactoryBurnMintERC20._approve | ['validAddress(address)']
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burnFrom | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burnFrom | 💥 > 🔗 Context._msgSender | 🟩
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burnFrom | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burnFrom | 💥 > 🔗 ERC20._burn | 🟢🔴
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burnFrom | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burnFrom | 💥 > 🔗 ERC20._spendAllowance |
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnFromMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burnFrom | 💥❌ ['onlyBurner'] > 🔗 FactoryBurnMintERC20.onlyBurner | 🌈 > 🔗 FactoryBurnMintERC20.isBurner | 💥🟢🟩
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burn | 💥 > 🔗 ERC20._burn | 🟢🔴 > 🔗 ERC20._afterTokenTransfer |
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burn | 💥 > 🔗 ERC20._burn | 🟢🔴 > 🔗 ERC20._beforeTokenTransfer |
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burn | 💥 > 🔗 Context._msgSender | 🟩
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burn | 💥 > 🔗 ERC20._burn | 🟢🔴
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner'] > 🔗 FactoryBurnMintERC20.onlyBurner | 🌈 > 🔗 FactoryBurnMintERC20.isBurner | 💥🟢🟩
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnWithFromMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥 > 🔗 FactoryBurnMintERC20.burnFrom | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burnFrom | 💥
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 BurnWithFromMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥 > 🔗 FactoryBurnMintERC20.burnFrom | 💥❌ ['onlyBurner'] > 🔗 FactoryBurnMintERC20.onlyBurner | 🌈
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢 > 🔗 RateLimiter._consume | > 🔗 RateLimiter._calculateRefill | 🟩
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintTokenPoolAbstract.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 TokenPool.isSupportedChain | 💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burn | 💥 > 🔗 ERC20._burn | 🟢🔴 > 🔗 ERC20._afterTokenTransfer |
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 ERC20Burnable.burn | 💥 > 🔗 ERC20._burn | 🟢🔴 > 🔗 ERC20._beforeTokenTransfer |
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burn | 💥 > 🔗 Context._msgSender | 🟩
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burn | 💥 > 🔗 ERC20._burn | 🟢🔴
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 BurnMintTokenPool._burn | 🟢 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner'] > 🔗 FactoryBurnMintERC20.onlyBurner | 🌈 > 🔗 FactoryBurnMintERC20.isBurner | 💥🟢🟩
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢 > 🔗 RateLimiter._consume | > 🔗 RateLimiter._calculateRefill | 🟩
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 BurnMintWithLockReleaseFlagTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 TokenPool.isSupportedChain | 💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢 > 🔗 RateLimiter._consume |
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 IRouter.getOnRamp | 💥🟩
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 Router.getOnRamp | 💥🟢🟩
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 HybridLockReleaseUSDCTokenPool._lockReleaseOutgoingMessage | 🟢🔴 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 TokenPool.isSupportedChain | 💥🟢🟩
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢 > 🔗 RateLimiter._consume |
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 IRouter.getOnRamp | 💥🟩
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 Router.getOnRamp | 💥🟢🟩
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 HybridLockReleaseUSDCTokenPool.lockOrBurn | 💥🟢 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 TokenPool.isSupportedChain | 💥🟢🟩
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢 > 🔗 RateLimiter._consume | > 🔗 RateLimiter._calculateRefill | 🟩
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 LockReleaseTokenPool.lockOrBurn | 💥 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 TokenPool.isSupportedChain | 💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 TokenPool.supportsInterface | 💥🟩
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._checkAllowList | 🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._consumeOutboundRateLimit | 🟢 > 🔗 RateLimiter._consume | > 🔗 RateLimiter._calculateRefill | 🟩
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.forwardFromRouter | 🎯💥🟢🔴 > 🔗 OnRamp._lockOrBurnSingleToken | 🎯 > 🔗 USDCTokenPool.lockOrBurn | 💥🟢 > 🔗 TokenPool._validateLockOrBurn | 🟢 > 🔗 TokenPool._onlyOnRamp | 🟢🟩 > 🔗 TokenPool.isSupportedChain | 💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenTransferCost | 🎯🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 AggregatorV3Interface.decimals | 💥🟩
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenTransferCost | 🎯🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 AggregatorV3Interface.latestRoundData | 💥🟩
🔗 Router.ccipSend | 💥🟢💲 ['whenNotCursed'] > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenTransferCost | 🎯🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 FeeQuoter._calculateRebasedValue | 🎯🟢🟩
🔗 Router.getFee | 💥🟢🟩 > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenTransferCost | 🎯🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 AggregatorV3Interface.decimals | 💥🟩
🔗 Router.getFee | 💥🟢🟩 > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenTransferCost | 🎯🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 AggregatorV3Interface.latestRoundData | 💥🟩
🔗 Router.getFee | 💥🟢🟩 > 🔗 OnRamp.getFee | 🎯💥🟢🟩 > 🔗 FeeQuoter.getValidatedFee | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenTransferCost | 🎯🟢🟩 > 🔗 FeeQuoter._getValidatedTokenPrice | 🎯🟩 > 🔗 FeeQuoter.getTokenPrice | 🎯💥🟢🟩 > 🔗 FeeQuoter._getTokenPriceFromDataFeed | 🎯🟩 > 🔗 FeeQuoter._calculateRebasedValue | 🎯🟢🟩
🔗 Router.getOffRamps | 💥🟢🟩 > 🔗 EnumerableSet.values | 🟩 > 🔗 EnumerableSet._values | 🟩
🔗 Router.getSupportedTokens | 💥🟢🟩 > 🔗 IEVM2AnyOnRampClient.getSupportedTokens | 💥🟩
🔗 Router.getSupportedTokens | 💥🟢🟩 > 🔗 OnRamp.getSupportedTokens | 🎯💥🟩
🔗 Router.getSupportedTokens | 💥🟢🟩 > 🔗 Router.isChainSupported | 💥🟢🟩
🔗 Router.recoverTokens | 💥❌❗ ['onlyOwner'] > 🔗 ConfirmedOwnerWithProposal.onlyOwner | 🌈 > 🔗 ConfirmedOwnerWithProposal._validateOwnership | 🟢🟩
🔗 Router.recoverTokens | 💥❌❗ ['onlyOwner'] > 🔗 SafeERC20.safeTransfer | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address._revert | 🟩
🔗 Router.recoverTokens | 💥❌❗ ['onlyOwner'] > 🔗 SafeERC20.safeTransfer | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address.isContract | 🟩
🔗 Router.setWrappedNative | 💥🔴❌ ['onlyOwner'] > 🔗 ConfirmedOwnerWithProposal.onlyOwner | 🌈 > 🔗 ConfirmedOwnerWithProposal._validateOwnership | 🟢🟩
🔗 SafeERC20.safeApprove | > 🔗 ERC20.allowance | 💥🟢🟩
🔗 SafeERC20.safeApprove | > 🔗 IERC20.allowance | 💥🟩
🔗 SafeERC20.safeApprove | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address._revert | 🟩
🔗 SafeERC20.safeApprove | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address.isContract | 🟩
🔗 SafeERC20.safeDecreaseAllowance | > 🔗 ERC20.allowance | 💥🟢🟩
🔗 SafeERC20.safeDecreaseAllowance | > 🔗 IERC20.allowance | 💥🟩
🔗 SafeERC20.safeDecreaseAllowance | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address._revert | 🟩
🔗 SafeERC20.safeDecreaseAllowance | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address.isContract | 🟩
🔗 SafeERC20.safeIncreaseAllowance | > 🔗 IERC20.allowance | 💥🟩
🔗 SafeERC20.safePermit | > 🔗 IERC20Permit.nonces | 💥🟩
🔗 SafeERC20.safePermit | > 🔗 IERC20Permit.permit | 💥
🔗 TokenAdminRegistry.addRegistryModule | 💥🟢❌ ['onlyOwner'] > 🔗 EnumerableSet.add | > 🔗 EnumerableSet._add | > 🔗 EnumerableSet._contains | 🟩
🔗 TokenAdminRegistry.addRegistryModule | 💥🟢❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 TokenAdminRegistry.getAllConfiguredTokens | 💥🟢🟩 > 🔗 EnumerableSet.at | 🟩 > 🔗 EnumerableSet._at | 🟩
🔗 TokenAdminRegistry.getAllConfiguredTokens | 💥🟢🟩 > 🔗 EnumerableSet.length | 🟩 > 🔗 EnumerableSet._length | 🟩
🔗 TokenAdminRegistry.removeRegistryModule | 💥🟢❌ ['onlyOwner'] > 🔗 EnumerableSet.remove | > 🔗 EnumerableSet._remove |
🔗 TokenAdminRegistry.removeRegistryModule | 💥🟢❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 TokenPool.applyAllowListUpdates | 💥❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 TokenPool.applyAllowListUpdates | 💥❌ ['onlyOwner'] > 🔗 TokenPool._applyAllowListUpdates | 🟢 > 🔗 EnumerableSet.add | > 🔗 EnumerableSet._add | > 🔗 EnumerableSet._contains | 🟩
🔗 TokenPool.applyAllowListUpdates | 💥❌ ['onlyOwner'] > 🔗 TokenPool._applyAllowListUpdates | 🟢 > 🔗 EnumerableSet.remove | > 🔗 EnumerableSet._remove |
🔗 TokenPool.applyChainUpdates | 💥🟢🔴❌ ['onlyOwner'] > 🔗 EnumerableSet.add | > 🔗 EnumerableSet._add | > 🔗 EnumerableSet._contains | 🟩
🔗 TokenPool.applyChainUpdates | 💥🟢🔴❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 TokenPool.applyChainUpdates | 💥🟢🔴❌ ['onlyOwner'] > 🔗 RateLimiter._validateTokenBucketConfig | 🟩
🔗 TokenPool.constructor | 🟢🔴 > 🔗 TokenPool._applyAllowListUpdates | 🟢 > 🔗 EnumerableSet.add | > 🔗 EnumerableSet._add | > 🔗 EnumerableSet._contains | 🟩
🔗 TokenPool.constructor | 🟢🔴 > 🔗 TokenPool._applyAllowListUpdates | 🟢 > 🔗 EnumerableSet.remove | > 🔗 EnumerableSet._remove |
🔗 TokenPool.getAllowList | 💥🟢🟩 > 🔗 EnumerableSet.values | 🟩 > 🔗 EnumerableSet._values | 🟩
🔗 TokenPool.getCurrentInboundRateLimiterState | 💥🟢🟩 > 🔗 RateLimiter._currentTokenBucketState | 🟩 > 🔗 RateLimiter._calculateRefill | 🟩 > 🔗 RateLimiter._min | 🟩
🔗 TokenPool.getCurrentOutboundRateLimiterState | 💥🟢🟩 > 🔗 RateLimiter._currentTokenBucketState | 🟩 > 🔗 RateLimiter._calculateRefill | 🟩 > 🔗 RateLimiter._min | 🟩
🔗 TokenPool.getSupportedChains | 💥🟢🟩 > 🔗 EnumerableSet.values | 🟩 > 🔗 EnumerableSet._values | 🟩
🔗 TokenPool.setChainRateLimiterConfig | 💥🟢 > 🔗 Ownable2Step.owner | 💥🟢🟩
🔗 TokenPool.setChainRateLimiterConfig | 💥🟢 > 🔗 TokenPool._setRateLimitConfig | 🟢 > 🔗 RateLimiter._setTokenBucketConfig | > 🔗 RateLimiter._calculateRefill | 🟩 > 🔗 RateLimiter._min | 🟩
🔗 TokenPool.setChainRateLimiterConfig | 💥🟢 > 🔗 TokenPool._setRateLimitConfig | 🟢 > 🔗 RateLimiter._setTokenBucketConfig | > 🔗 RateLimiter._min | 🟩
🔗 TokenPool.setChainRateLimiterConfig | 💥🟢 > 🔗 TokenPool._setRateLimitConfig | 🟢 > 🔗 RateLimiter._validateTokenBucketConfig | 🟩
🔗 TokenPool.setChainRateLimiterConfig | 💥🟢 > 🔗 TokenPool._setRateLimitConfig | 🟢 > 🔗 TokenPool.isSupportedChain | 💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 TokenPool.setRateLimitAdmin | 💥🔴❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 TokenPool.setRemotePool | 💥🟢🔴❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 TokenPool.setRemotePool | 💥🟢🔴❌ ['onlyOwner'] > 🔗 TokenPool.isSupportedChain | 💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 TokenPool.setRouter | 💥🟢🔴❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 TokenPoolFactory._createTokenPool | 🟢 > 🔗 Ownable2Step.transferOwnership | 💥❌ ['onlyOwner'] > 🔗 Ownable2Step._transferOwnership | 🟢🔴
🔗 TokenPoolFactory._createTokenPool | 🟢 > 🔗 Ownable2Step.transferOwnership | 💥❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 TokenPoolFactory._createTokenPool | 🟢 > 🔗 TokenPool.applyChainUpdates | 💥🟢🔴❌ ['onlyOwner'] > 🔗 EnumerableSet.add | > 🔗 EnumerableSet._add |
🔗 TokenPoolFactory._createTokenPool | 🟢 > 🔗 TokenPool.applyChainUpdates | 💥🟢🔴❌ ['onlyOwner'] > 🔗 EnumerableSet.remove | > 🔗 EnumerableSet._remove |
🔗 TokenPoolFactory._createTokenPool | 🟢 > 🔗 TokenPool.applyChainUpdates | 💥🟢🔴❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈
🔗 TokenPoolFactory._createTokenPool | 🟢 > 🔗 TokenPool.applyChainUpdates | 💥🟢🔴❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 TokenPoolFactory._setTokenPoolInTokenAdminRegistry | 🟢 > 🔗 TokenAdminRegistry.setPool | 💥🟢🔴❌ ['onlyTokenAdmin(address)'] > 🔗 IPoolV1.isSupportedToken | 💥🟩
🔗 TokenPoolFactory.deployTokenAndTokenPool | 💥 > 🔗 ConfirmedOwnerWithProposal.transferOwnership | 💥❌ ['onlyOwner'] > 🔗 ConfirmedOwnerWithProposal._transferOwnership | 🟢🔴
🔗 TokenPoolFactory.deployTokenAndTokenPool | 💥 > 🔗 ConfirmedOwnerWithProposal.transferOwnership | 💥❌ ['onlyOwner'] > 🔗 ConfirmedOwnerWithProposal.onlyOwner | 🌈
🔗 TokenPoolFactory.deployTokenAndTokenPool | 💥 > 🔗 ConfirmedOwnerWithProposal.transferOwnership | 💥❌ ['onlyOwner'] > 🔗 ConfirmedOwnerWithProposal.onlyOwner | 🌈 > 🔗 ConfirmedOwnerWithProposal._validateOwnership | 🟢🟩
🔗 TokenPoolFactory.deployTokenAndTokenPool | 💥 > 🔗 Create2.deploy |
🔗 TokenPoolFactory.deployTokenAndTokenPool | 💥 > 🔗 FactoryBurnMintERC20.grantMintAndBurnRoles | 💥 > 🔗 FactoryBurnMintERC20.grantBurnRole | 💥🟢❌ ['onlyOwner'] > 🔗 EnumerableSet.add | > 🔗 EnumerableSet._add | > 🔗 EnumerableSet._contains | 🟩
🔗 TokenPoolFactory.deployTokenAndTokenPool | 💥 > 🔗 FactoryBurnMintERC20.grantMintAndBurnRoles | 💥 > 🔗 FactoryBurnMintERC20.grantBurnRole | 💥🟢❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 TokenPoolFactory.deployTokenAndTokenPool | 💥 > 🔗 FactoryBurnMintERC20.grantMintAndBurnRoles | 💥 > 🔗 FactoryBurnMintERC20.grantMintRole | 💥🟢❌ ['onlyOwner'] > 🔗 EnumerableSet.add | > 🔗 EnumerableSet._add | > 🔗 EnumerableSet._contains | 🟩
🔗 TokenPoolFactory.deployTokenAndTokenPool | 💥 > 🔗 FactoryBurnMintERC20.grantMintAndBurnRoles | 💥 > 🔗 FactoryBurnMintERC20.grantMintRole | 💥🟢❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 TokenPoolFactory.deployTokenAndTokenPool | 💥 > 🔗 IOwnable.transferOwnership | 💥
🔗 TokenPoolFactory.deployTokenAndTokenPool | 💥 > 🔗 Ownable2Step.transferOwnership | 💥❌ ['onlyOwner']
🔗 TokenPoolFactory.deployTokenAndTokenPool | 💥 > 🔗 Ownable2Step.transferOwnership | 💥❌ ['onlyOwner'] > 🔗 Ownable2Step._transferOwnership | 🟢🔴
🔗 TokenPoolFactory.deployTokenAndTokenPool | 💥 > 🔗 Ownable2Step.transferOwnership | 💥❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈
🔗 TokenPoolFactory.deployTokenAndTokenPool | 💥 > 🔗 Ownable2Step.transferOwnership | 💥❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 TokenPoolFactory.deployTokenAndTokenPool | 💥 > 🔗 TokenPoolFactory._createTokenPool | 🟢 > 🔗 ConfirmedOwnerWithProposal.transferOwnership | 💥❌ ['onlyOwner'] > 🔗 ConfirmedOwnerWithProposal._transferOwnership | 🟢🔴
🔗 TokenPoolFactory.deployTokenAndTokenPool | 💥 > 🔗 TokenPoolFactory._createTokenPool | 🟢 > 🔗 ConfirmedOwnerWithProposal.transferOwnership | 💥❌ ['onlyOwner'] > 🔗 ConfirmedOwnerWithProposal.onlyOwner | 🌈
🔗 TokenPoolFactory.deployTokenAndTokenPool | 💥 > 🔗 TokenPoolFactory._createTokenPool | 🟢 > 🔗 ConfirmedOwnerWithProposal.transferOwnership | 💥❌ ['onlyOwner'] > 🔗 ConfirmedOwnerWithProposal.onlyOwner | 🌈 > 🔗 ConfirmedOwnerWithProposal._validateOwnership | 🟢🟩
🔗 TokenPoolFactory.deployTokenAndTokenPool | 💥 > 🔗 TokenPoolFactory._createTokenPool | 🟢 > 🔗 Create2.computeAddress | 🟩
🔗 TokenPoolFactory.deployTokenAndTokenPool | 💥 > 🔗 TokenPoolFactory._createTokenPool | 🟢 > 🔗 Create2.deploy |
🔗 TokenPoolFactory.deployTokenAndTokenPool | 💥 > 🔗 TokenPoolFactory._createTokenPool | 🟢 > 🔗 IOwnable.transferOwnership | 💥
🔗 TokenPoolFactory.deployTokenAndTokenPool | 💥 > 🔗 TokenPoolFactory._createTokenPool | 🟢 > 🔗 Ownable2Step.transferOwnership | 💥❌ ['onlyOwner'] > 🔗 Ownable2Step._transferOwnership | 🟢🔴
🔗 TokenPoolFactory.deployTokenAndTokenPool | 💥 > 🔗 TokenPoolFactory._createTokenPool | 🟢 > 🔗 Ownable2Step.transferOwnership | 💥❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈
🔗 TokenPoolFactory.deployTokenAndTokenPool | 💥 > 🔗 TokenPoolFactory._createTokenPool | 🟢 > 🔗 Ownable2Step.transferOwnership | 💥❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 TokenPoolFactory.deployTokenAndTokenPool | 💥 > 🔗 TokenPoolFactory._createTokenPool | 🟢 > 🔗 TokenPool.applyChainUpdates | 💥🟢🔴❌ ['onlyOwner']
🔗 TokenPoolFactory.deployTokenAndTokenPool | 💥 > 🔗 TokenPoolFactory._createTokenPool | 🟢 > 🔗 TokenPool.applyChainUpdates | 💥🟢🔴❌ ['onlyOwner'] > 🔗 EnumerableSet.add |
🔗 TokenPoolFactory.deployTokenAndTokenPool | 💥 > 🔗 TokenPoolFactory._createTokenPool | 🟢 > 🔗 TokenPool.applyChainUpdates | 💥🟢🔴❌ ['onlyOwner'] > 🔗 EnumerableSet.add | > 🔗 EnumerableSet._add |
🔗 TokenPoolFactory.deployTokenAndTokenPool | 💥 > 🔗 TokenPoolFactory._createTokenPool | 🟢 > 🔗 TokenPool.applyChainUpdates | 💥🟢🔴❌ ['onlyOwner'] > 🔗 EnumerableSet.add | > 🔗 EnumerableSet._add | > 🔗 EnumerableSet._contains | 🟩
🔗 TokenPoolFactory.deployTokenAndTokenPool | 💥 > 🔗 TokenPoolFactory._createTokenPool | 🟢 > 🔗 TokenPool.applyChainUpdates | 💥🟢🔴❌ ['onlyOwner'] > 🔗 EnumerableSet.remove | > 🔗 EnumerableSet._remove |
🔗 TokenPoolFactory.deployTokenAndTokenPool | 💥 > 🔗 TokenPoolFactory._createTokenPool | 🟢 > 🔗 TokenPool.applyChainUpdates | 💥🟢🔴❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈
🔗 TokenPoolFactory.deployTokenAndTokenPool | 💥 > 🔗 TokenPoolFactory._createTokenPool | 🟢 > 🔗 TokenPool.applyChainUpdates | 💥🟢🔴❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 TokenPoolFactory.deployTokenAndTokenPool | 💥 > 🔗 TokenPoolFactory._createTokenPool | 🟢 > 🔗 TokenPool.applyChainUpdates | 💥🟢🔴❌ ['onlyOwner'] > 🔗 RateLimiter._validateTokenBucketConfig | 🟩
🔗 TokenPoolFactory.deployTokenAndTokenPool | 💥 > 🔗 TokenPoolFactory._createTokenPool | 🟢 > 🔗 TokenPoolFactory._generatePoolInitcodeHash | 🟩
🔗 TokenPoolFactory.deployTokenAndTokenPool | 💥 > 🔗 TokenPoolFactory._setTokenPoolInTokenAdminRegistry | 🟢 > 🔗 ITokenAdminRegistry.acceptAdminRole | 💥
🔗 TokenPoolFactory.deployTokenAndTokenPool | 💥 > 🔗 TokenPoolFactory._setTokenPoolInTokenAdminRegistry | 🟢 > 🔗 ITokenAdminRegistry.setPool | 💥
🔗 TokenPoolFactory.deployTokenAndTokenPool | 💥 > 🔗 TokenPoolFactory._setTokenPoolInTokenAdminRegistry | 🟢 > 🔗 ITokenAdminRegistry.transferAdminRole | 💥
🔗 TokenPoolFactory.deployTokenAndTokenPool | 💥 > 🔗 TokenPoolFactory._setTokenPoolInTokenAdminRegistry | 🟢 > 🔗 RegistryModuleOwnerCustom.registerAdminViaOwner | 💥 > 🔗 IOwner.owner | 💥🟩
🔗 TokenPoolFactory.deployTokenAndTokenPool | 💥 > 🔗 TokenPoolFactory._setTokenPoolInTokenAdminRegistry | 🟢 > 🔗 RegistryModuleOwnerCustom.registerAdminViaOwner | 💥 > 🔗 RegistryModuleOwnerCustom._registerAdmin | 🟢 > 🔗 ITokenAdminRegistry.proposeAdministrator | 💥
🔗 TokenPoolFactory.deployTokenAndTokenPool | 💥 > 🔗 TokenPoolFactory._setTokenPoolInTokenAdminRegistry | 🟢 > 🔗 RegistryModuleOwnerCustom.registerAdminViaOwner | 💥 > 🔗 RegistryModuleOwnerCustom._registerAdmin | 🟢 > 🔗 TokenAdminRegistry.proposeAdministrator | 💥🟢🔴 > 🔗 EnumerableSet.add | > 🔗 EnumerableSet._add | > 🔗 EnumerableSet._contains | 🟩
🔗 TokenPoolFactory.deployTokenAndTokenPool | 💥 > 🔗 TokenPoolFactory._setTokenPoolInTokenAdminRegistry | 🟢 > 🔗 RegistryModuleOwnerCustom.registerAdminViaOwner | 💥 > 🔗 RegistryModuleOwnerCustom._registerAdmin | 🟢 > 🔗 TokenAdminRegistry.proposeAdministrator | 💥🟢🔴 > 🔗 Ownable2Step.owner | 💥🟢🟩
🔗 TokenPoolFactory.deployTokenAndTokenPool | 💥 > 🔗 TokenPoolFactory._setTokenPoolInTokenAdminRegistry | 🟢 > 🔗 RegistryModuleOwnerCustom.registerAdminViaOwner | 💥 > 🔗 RegistryModuleOwnerCustom._registerAdmin | 🟢 > 🔗 TokenAdminRegistry.proposeAdministrator | 💥🟢🔴 > 🔗 TokenAdminRegistry.isRegistryModule | 💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 TokenPoolFactory.deployTokenAndTokenPool | 💥 > 🔗 TokenPoolFactory._setTokenPoolInTokenAdminRegistry | 🟢 > 🔗 TokenAdminRegistry.acceptAdminRole | 💥🟢🔴
🔗 TokenPoolFactory.deployTokenAndTokenPool | 💥 > 🔗 TokenPoolFactory._setTokenPoolInTokenAdminRegistry | 🟢 > 🔗 TokenAdminRegistry.setPool | 💥🟢🔴❌ ['onlyTokenAdmin(address)'] > 🔗 IPoolV1.isSupportedToken | 💥🟩
🔗 TokenPoolFactory.deployTokenAndTokenPool | 💥 > 🔗 TokenPoolFactory._setTokenPoolInTokenAdminRegistry | 🟢 > 🔗 TokenAdminRegistry.setPool | 💥🟢🔴❌ ['onlyTokenAdmin(address)'] > 🔗 TokenAdminRegistry.onlyTokenAdmin | 🌈🟢
🔗 TokenPoolFactory.deployTokenAndTokenPool | 💥 > 🔗 TokenPoolFactory._setTokenPoolInTokenAdminRegistry | 🟢 > 🔗 TokenAdminRegistry.setPool | 💥🟢🔴❌ ['onlyTokenAdmin(address)'] > 🔗 TokenPool.isSupportedToken | 💥🟢🟩
🔗 TokenPoolFactory.deployTokenAndTokenPool | 💥 > 🔗 TokenPoolFactory._setTokenPoolInTokenAdminRegistry | 🟢 > 🔗 TokenAdminRegistry.transferAdminRole | 💥🟢🔴❌ ['onlyTokenAdmin(address)'] > 🔗 TokenAdminRegistry.onlyTokenAdmin | 🌈🟢
🔗 TokenPoolFactory.deployTokenPoolWithExistingToken | 💥 > 🔗 TokenPoolFactory._createTokenPool | 🟢 > 🔗 ConfirmedOwnerWithProposal.transferOwnership | 💥❌ ['onlyOwner']
🔗 TokenPoolFactory.deployTokenPoolWithExistingToken | 💥 > 🔗 TokenPoolFactory._createTokenPool | 🟢 > 🔗 ConfirmedOwnerWithProposal.transferOwnership | 💥❌ ['onlyOwner'] > 🔗 ConfirmedOwnerWithProposal._transferOwnership | 🟢🔴
🔗 TokenPoolFactory.deployTokenPoolWithExistingToken | 💥 > 🔗 TokenPoolFactory._createTokenPool | 🟢 > 🔗 ConfirmedOwnerWithProposal.transferOwnership | 💥❌ ['onlyOwner'] > 🔗 ConfirmedOwnerWithProposal.onlyOwner | 🌈
🔗 TokenPoolFactory.deployTokenPoolWithExistingToken | 💥 > 🔗 TokenPoolFactory._createTokenPool | 🟢 > 🔗 ConfirmedOwnerWithProposal.transferOwnership | 💥❌ ['onlyOwner'] > 🔗 ConfirmedOwnerWithProposal.onlyOwner | 🌈 > 🔗 ConfirmedOwnerWithProposal._validateOwnership | 🟢🟩
🔗 TokenPoolFactory.deployTokenPoolWithExistingToken | 💥 > 🔗 TokenPoolFactory._createTokenPool | 🟢 > 🔗 Create2.computeAddress | 🟩
🔗 TokenPoolFactory.deployTokenPoolWithExistingToken | 💥 > 🔗 TokenPoolFactory._createTokenPool | 🟢 > 🔗 Create2.deploy |
🔗 TokenPoolFactory.deployTokenPoolWithExistingToken | 💥 > 🔗 TokenPoolFactory._createTokenPool | 🟢 > 🔗 IOwnable.transferOwnership | 💥
🔗 TokenPoolFactory.deployTokenPoolWithExistingToken | 💥 > 🔗 TokenPoolFactory._createTokenPool | 🟢 > 🔗 Ownable2Step.transferOwnership | 💥❌ ['onlyOwner'] > 🔗 Ownable2Step._transferOwnership | 🟢🔴
🔗 TokenPoolFactory.deployTokenPoolWithExistingToken | 💥 > 🔗 TokenPoolFactory._createTokenPool | 🟢 > 🔗 Ownable2Step.transferOwnership | 💥❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈
🔗 TokenPoolFactory.deployTokenPoolWithExistingToken | 💥 > 🔗 TokenPoolFactory._createTokenPool | 🟢 > 🔗 Ownable2Step.transferOwnership | 💥❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 TokenPoolFactory.deployTokenPoolWithExistingToken | 💥 > 🔗 TokenPoolFactory._createTokenPool | 🟢 > 🔗 TokenPool.applyChainUpdates | 💥🟢🔴❌ ['onlyOwner'] > 🔗 EnumerableSet.add |
🔗 TokenPoolFactory.deployTokenPoolWithExistingToken | 💥 > 🔗 TokenPoolFactory._createTokenPool | 🟢 > 🔗 TokenPool.applyChainUpdates | 💥🟢🔴❌ ['onlyOwner'] > 🔗 EnumerableSet.add | > 🔗 EnumerableSet._add |
🔗 TokenPoolFactory.deployTokenPoolWithExistingToken | 💥 > 🔗 TokenPoolFactory._createTokenPool | 🟢 > 🔗 TokenPool.applyChainUpdates | 💥🟢🔴❌ ['onlyOwner'] > 🔗 EnumerableSet.add | > 🔗 EnumerableSet._add | > 🔗 EnumerableSet._contains | 🟩
🔗 TokenPoolFactory.deployTokenPoolWithExistingToken | 💥 > 🔗 TokenPoolFactory._createTokenPool | 🟢 > 🔗 TokenPool.applyChainUpdates | 💥🟢🔴❌ ['onlyOwner'] > 🔗 EnumerableSet.remove |
🔗 TokenPoolFactory.deployTokenPoolWithExistingToken | 💥 > 🔗 TokenPoolFactory._createTokenPool | 🟢 > 🔗 TokenPool.applyChainUpdates | 💥🟢🔴❌ ['onlyOwner'] > 🔗 EnumerableSet.remove | > 🔗 EnumerableSet._remove |
🔗 TokenPoolFactory.deployTokenPoolWithExistingToken | 💥 > 🔗 TokenPoolFactory._createTokenPool | 🟢 > 🔗 TokenPool.applyChainUpdates | 💥🟢🔴❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈
🔗 TokenPoolFactory.deployTokenPoolWithExistingToken | 💥 > 🔗 TokenPoolFactory._createTokenPool | 🟢 > 🔗 TokenPool.applyChainUpdates | 💥🟢🔴❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 TokenPoolFactory.deployTokenPoolWithExistingToken | 💥 > 🔗 TokenPoolFactory._createTokenPool | 🟢 > 🔗 TokenPool.applyChainUpdates | 💥🟢🔴❌ ['onlyOwner'] > 🔗 RateLimiter._validateTokenBucketConfig | 🟩
🔗 TokenPoolFactory.deployTokenPoolWithExistingToken | 💥 > 🔗 TokenPoolFactory._createTokenPool | 🟢 > 🔗 TokenPoolFactory._generatePoolInitcodeHash | 🟩
🔗 USDCBridgeMigrator.burnLockedUSDC | 💥🟢🔴 > 🔗 ERC20Burnable.burn | 💥 > 🔗 Context._msgSender | 🟩
🔗 USDCBridgeMigrator.burnLockedUSDC | 💥🟢🔴 > 🔗 ERC20Burnable.burn | 💥 > 🔗 ERC20._burn | 🟢🔴 > 🔗 ERC20._afterTokenTransfer |
🔗 USDCBridgeMigrator.burnLockedUSDC | 💥🟢🔴 > 🔗 ERC20Burnable.burn | 💥 > 🔗 ERC20._burn | 🟢🔴 > 🔗 ERC20._beforeTokenTransfer |
🔗 USDCBridgeMigrator.burnLockedUSDC | 💥🟢🔴 > 🔗 EnumerableSet.add | > 🔗 EnumerableSet._add | > 🔗 EnumerableSet._contains | 🟩
🔗 USDCBridgeMigrator.burnLockedUSDC | 💥🟢🔴 > 🔗 EnumerableSet.add | > 🔗 EnumerableSet._add | > 🔗 EnumerableSet._contains | 🟩
🔗 USDCBridgeMigrator.burnLockedUSDC | 💥🟢🔴 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burn | 💥 > 🔗 Context._msgSender | 🟩
🔗 USDCBridgeMigrator.burnLockedUSDC | 💥🟢🔴 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burn | 💥 > 🔗 ERC20._burn | 🟢🔴 > 🔗 ERC20._afterTokenTransfer |
🔗 USDCBridgeMigrator.burnLockedUSDC | 💥🟢🔴 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner'] > 🔗 ERC20Burnable.burn | 💥 > 🔗 ERC20._burn | 🟢🔴 > 🔗 ERC20._beforeTokenTransfer |
🔗 USDCBridgeMigrator.burnLockedUSDC | 💥🟢🔴 > 🔗 FactoryBurnMintERC20.burn | 💥❌ ['onlyBurner'] > 🔗 FactoryBurnMintERC20.onlyBurner | 🌈 > 🔗 FactoryBurnMintERC20.isBurner | 💥🟢🟩 > 🔗 EnumerableSet.contains | 🟩 > 🔗 EnumerableSet._contains | 🟩
🔗 USDCBridgeMigrator.burnLockedUSDC | 💥🟢🔴 > 🔗 IBurnMintERC20.burn | 💥
🔗 USDCBridgeMigrator.cancelExistingCCTPMigrationProposal | 💥🟢🔴❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 USDCBridgeMigrator.excludeTokensFromBurn | 💥🟢🔴❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 USDCBridgeMigrator.proposeCCTPMigration | 💥🟢🔴❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 USDCBridgeMigrator.setCircleMigratorAddress | 💥🔴❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩
🔗 USDCTokenPool.constructor | 💥🟢🔴 > 🔗 IMessageTransmitter.localDomain | 💥🟩
🔗 USDCTokenPool.constructor | 💥🟢🔴 > 🔗 IMessageTransmitter.version | 💥🟩
🔗 USDCTokenPool.constructor | 💥🟢🔴 > 🔗 ITokenMessenger.localMessageTransmitter | 💥🟩
🔗 USDCTokenPool.constructor | 💥🟢🔴 > 🔗 ITokenMessenger.messageBodyVersion | 💥🟩
🔗 USDCTokenPool.constructor | 💥🟢🔴 > 🔗 SafeERC20.safeIncreaseAllowance | > 🔗 ERC20.allowance | 💥🟢🟩
🔗 USDCTokenPool.constructor | 💥🟢🔴 > 🔗 SafeERC20.safeIncreaseAllowance | > 🔗 IERC20.allowance | 💥🟩
🔗 USDCTokenPool.constructor | 💥🟢🔴 > 🔗 SafeERC20.safeIncreaseAllowance | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address._revert | 🟩
🔗 USDCTokenPool.constructor | 💥🟢🔴 > 🔗 SafeERC20.safeIncreaseAllowance | > 🔗 SafeERC20._callOptionalReturn | > 🔗 Address.functionCall | > 🔗 Address.functionCallWithValue | ❗ > 🔗 Address.verifyCallResultFromTarget | 🟩 > 🔗 Address.isContract | 🟩
🔗 USDCTokenPool.constructor | 💥🟢🔴 > 🔗 TokenPool.constructor | 🟢🔴 > 🔗 TokenPool._applyAllowListUpdates | 🟢 > 🔗 EnumerableSet.add | > 🔗 EnumerableSet._add | > 🔗 EnumerableSet._contains | 🟩
🔗 USDCTokenPool.constructor | 💥🟢🔴 > 🔗 TokenPool.constructor | 🟢🔴 > 🔗 TokenPool._applyAllowListUpdates | 🟢 > 🔗 EnumerableSet.remove | > 🔗 EnumerableSet._remove |
🔗 USDCTokenPool.setDomains | 💥🔴❌ ['onlyOwner'] > 🔗 Ownable2Step.onlyOwner | 🌈 > 🔗 Ownable2Step._validateOwnership | 🟢🟩